逆波兰表达式求值

逆波兰表达式求值

  • 一:中缀表达式和逆波兰表达式
  • 二:力扣:[逆波兰表达式求值](https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/)
  • 二:原理:
  • 三:代码实现:

一:中缀表达式和逆波兰表达式

中缀表达式就是我们日常生活中的基本运算:
比如:1+(4*2)+3+(6/2)=15;
逆波兰表达式又称为后缀表达式;
而逆波兰表达式是计算器计算的原理,根据逆波兰表达式,计算器可以计算出结果15

二:力扣:逆波兰表达式求值

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
注意:
有效的算符为 ‘+’、‘-’、‘*’ 和 ‘/’ 。
每个操作数(运算对象)都可以是一个整数或者另一个表达式。
两个整数之间的除法总是 向零截断 。
表达式中不含除零运算。
输入是一个根据逆波兰表示法表示的算术表达式。
答案及所有中间计算结果可以用 32 位 整数表示。

示例 1: 输入:tokens = [“2”,“1”,“+”,“3”,“*”] 输出:9 解释:该算式转化为常见的中缀算术表达式为:((2

        1. = 9

示例 2: 输入:tokens = [“4”,“13”,“5”,“/”,“+”] 输出:6 解释:该算式转化为常见的中缀算术表达式为:(4

  • (13 / 5)) = 6

示例 3: 输入:tokens =
[“10”,“6”,“9”,“3”,“+”,“-11”,““,”/“,””,“17”,“+”,“5”,“+”] 输出:22
解释:该算式转化为常见的中缀算术表达式为: ((10 * (6 / ((9 + 3) * -11))) + 17) + 5
= ((10 * (6 / (12 * -11))) + 17) + 5
= ((10 * (6 / -132)) + 17) + 5
= ((10 * 0) + 17) + 5
= (0 + 17) + 5
= 17 + 5
= 22

提示:

1 <= tokens.length <= 104
tokens[i] 是一个算符("+"、"-"、"*" 或 "/"),或是在范围 [-200, 200] 内的一个整数

逆波兰表达式: 逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。 平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * (
3 + 4 ) 。

该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。 逆波兰表达式主要有以下两个优点:
去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。

适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中

二:原理:

题目描述:

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。

利用数据结构中栈的相关知识;
我们在这里遍历字符串数组 tokens ,将拿到的每个数字(因为 tokens是字符串数组,而我们要的是整数哦,所以要类型转换)依次放到栈中,如果遍历到了字符"+“,”-“,”“,”/",我们就从栈顶拿出两个元素,先拿到的作为右操作数,后拿到的作为左操作数,然后再将计算的结果入栈,遍历完成后,返回最终的结果即可。
举个例子:后缀表达式为:1 2 3 * + 4 5 * 6 + 7 * +
首先将数字1 2 3 入栈,然后遇到了运算符 * 此时出栈3和2,3作为右操作数,2作为左操作数,将2
3的结果6入栈,
然后又遇到了运算符 ‘+’,在次出栈2个元素(6和1),将计算结果6+1=7入栈(在最后一次出栈前,并未出栈),继续遍历,入栈4,5,遇到运算符
',出栈5和4,将计算结果(45=20)入栈,继续遍历,
6入栈,然后遇到运算符’+’ 6和 20出栈,将计算结果(6+20=26)入栈,继续遍历,7入栈,然后遇到运算符’',7和26出栈,将计算结果(726=182)入栈,此时遇到运算符’+',出栈,182和前面未出栈元素7,将计算结果入栈,此时字符串数组全部遍历,得到最终结果182+7=189。
结合下图更好的理解。
在这里插入图片描述

三:代码实现:

class Solution {public int evalRPN(String[] tokens) {Stack<Integer> stack=new Stack<>();int num=0;for(int i=0;i<tokens.length;i++){if(tokens[i].equals("+")||tokens[i].equals("-")||tokens[i].equals("*")||tokens[i].equals("/")){int num2= stack.pop();int num1=stack.pop();switch(tokens[i]){case "+":num=num1+num2;break;case "-":num=num1-num2;break;case "*":num=num1*num2;break;case "/":num=num1/num2;break;}stack.push(num);}else{int l=Integer.valueOf(tokens[i]);stack.push(l);}}if(stack.empty()) {return num;}return stack.pop();}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/245255.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Centos图形化界面封装OpenStack Centos镜像

目录 背景 环境 宿主机环境安装 创建与安装Centos7.8虚机 虚机设置 安全相关 安装ACPI服务 安装cloud-init 安装cloud-utils-growpart 停⽌虚拟机 删除个性化信息 模板化与压缩 登录与验证 背景 今天早上在Centos官网下载的CentOS-7-aarch64-GenericCloud-2003.…

Kali Linux三种网络攻击方法总结(DDoS、CC和ARP欺骗)

本文章使用的是Kali Linux的2020-4-installer-amd64版本 Kali Linux的安装过程本文章不做过多说明&#xff0c;请自行百度 请正确使用DDos和CC攻击&#xff0c;不要用来做违反当地法律法规的事情&#xff0c;否则后果自负 CSDN大礼包&#xff1a;《黑客&网络安全入门&am…

CSS、JS文件无法正确加载至页面问题与解决

目录 1. 问题出现 2. 分析与解决 3. 总结 1. 问题出现 自己在写项目是时候&#xff0c;想启动浏览器查询首页面index.jsp的显示效果 预期效果应该是下面这样的&#xff1a; 但是实际上是这样的&#xff1a; 意思也就是说可能是关于CSS、JS相关的引入方面出了问题&#xff…

百为智能流控路由器 RCE漏洞复现

0x01 产品简介 BYTEVALUE 百为流控路由器是一款追求带宽利用率的多功能路由器。 0x02 漏洞概述 百为智能流控路由器 /goform/webRead/open 路由的 ?path 参数存在有回显的命令注入漏洞,未经身份认证的攻击者可以利用此漏洞执行任意指令&#xff0c;获取服务器权限。 0x03 复…

代码随想录算法训练营第41天| 343. 整数拆分 96.不同的二叉搜索树

JAVA代码编写 343. 整数拆分 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。示例 2: 输入: n 10…

Optional源码分析(涉及Objects源码和Stream源码)

研究Optional源码之前先谈一谈Objects源码。 主要代码&#xff1a; ForceInlinepublic static <T> T requireNonNull(T obj) {if (obj null) {throw new NullPointerException();} else {return obj;}}ForceInlinepublic static <T> T requireNonNull(T obj, Str…

单个 Zip 文件体积超过 40GB

单个 Zip 文件体积超过 40GB WinRAR 平时用的多,不过有时候为了更好的通用性,也常常用到 zip 格式.查了一下资料,说是 zip 单个文件的体积不能超过 4GB. 自己动手试了下,用 WinRAR 创建出来的 zip 文件,大小可以超过 40GB, 如下图 为了压缩速度快,压缩方式用的是 “存储” Wi…

PHP使用HTTP代码示例模板

PHP是一种广泛用于服务器端的编程语言&#xff0c;它提供了许多内置的函数和扩展&#xff0c;以便开发人员能够轻松地处理HTTP请求和响应。在PHP中&#xff0c;您可以使用以下代码示例模板来处理HTTP请求和生成HTTP响应。 php复制代码 <?php // 处理GET请求 if ($…

Synchronized关键字的底层原理

Synchronized实现 Synchronized创建的时候一个互斥的对象锁&#xff0c;每次只有一个线程可以获取该锁。 其底层主要是基于Monitor实现的&#xff0c;在对象的对象头中存储了MarkWord存储的就是Monitor的地址。 对象的内存结构 对象在内存中存储主要分为三个部分&#xff1a…

天翼云:“百万IOPS”助推政企上云

随着数字化转型的加速&#xff0c;越来越多的企业选择了业务上云。众所周知&#xff0c;不论是政企关键/核心业务中的大型数据库、NoSQL、AI训练&#xff0c;还是互联网业务中的游戏、渲染等场景&#xff0c;对数据读写IOPS和时延有极高的要求。作为全球领先的云服务商&#xf…

第二证券:国际金价创新高 国内锂电企业有望加速出海

12月首个交易日&#xff0c;两市股指盘中弱势下探&#xff0c;午后止跌回升&#xff0c;沪指、创业板指翻红&#xff0c;北证50指数再度跳水。到收盘&#xff0c;沪指微涨0.07%报3031.64点&#xff0c;深成指跌0.07%报9720.57点&#xff0c;创业板指涨0.19%报1926.28点&#xf…

SWD和JTAG

1、调试接口概念 1&#xff09;SWD&#xff1a;Serial Wire Debug&#xff0c;代表串行线调试&#xff0c;是ARM设计的协议&#xff0c;用于对其微控制器进行编程和调试。 SWD 引脚&#xff1a; SWDIO–串行数据线&#xff0c;用于数据的读出和写入SWDCLK–串行时钟线&#…