什么是逆波兰表达式

逆波兰表达式又叫做后缀表达式。逆波兰表示法是波兰逻辑学家J・卢卡西维兹(J・ Lukasewicz)于1929年首先提出的一种表达式的表示方法 [1] 。后来,人们就把用这种表示法写出的表达式称作“逆波兰表达式”。逆波兰表达式把运算量写在前面,把算符写在后面。

逻辑提问式类似于算术表达式,对于检索而言,这种表达式并不是最优和最简洁的形式,需要进行必要的转换。1929年波兰的逻辑学家卢卡西维兹(Jan Lucasiewicz)提出了将运算符放在运算项后面的逻辑表达式,又称“逆波兰表达式”。采用这种表达式组织逻辑提问式非常方便检索运算,是日本的福岛先生最早将逆波兰表达式应用于情报检索的,故又称为“福岛方法”。
简单说来,逆波兰表达式取掉表达式括号的原理是利用栈,如果当前字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈,最后当表达式扫描完后,栈里的就是结果。

正常的表达式 逆波兰表达式
1+2 1,2,+
1+(2*3) 1,2,3,*,+
(2 + 1) * 3 2, 1, +, 3, *
1*(2+3)+4 1,2,3,+,*,4,+
((10 * (6 / ((9 + 3) * -11))) + 17) + 5 10, 6, 9, 3, +, -11, *, /, *, 17, +, 5, +

题目

来源于力扣网第150题
https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/

根据逆波兰表示法,求表达式的值。

有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。

说明:

整数除法只保留整数部分。
给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
示例 1:

输入: [“2”, “1”, “+”, “3”, “*”]
输出: 9
解释: ((2 + 1) * 3) = 9
示例 2:

输入: [“4”, “13”, “5”, “/”, “+”]
输出: 6
解释: (4 + (13 / 5)) = 6
示例 3:

输入: [“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

分析

我们得到了一个标准的逆波兰表达式的String数组。我用一个list放入String格式的符号,用来判断我从String数组里面取出来的是否是符号。
构造一个栈,当遇到数字则压入栈,遇到符号则取出栈中前面两个数进行计算然后再压入栈,最后返回栈中唯一剩下的数就是计算结果。

代码及测试用例

测试及用例来源于力扣网题目第150题

 private static List<String> sign=new ArrayList<>();static {sign.add("+");sign.add("-");sign.add("*");sign.add("/");}public static void main(String[] args) {String[] arrs={"2", "1", "+", "3", "*"};System.out.println(evalRPN(arrs));  //9String[] arrs1={"4", "13", "5", "/", "+"};System.out.println(evalRPN(arrs1));  //6}public static int evalRPN(String[] tokens) {Stack<Integer> mathStack=new Stack<>();for (int i = 0; i <tokens.length ; i++) {String s=tokens[i];if(sign.contains(s)){Integer sum=0;Integer num2=mathStack.pop();Integer num1=mathStack.pop();if("+".equals(s)){sum=num1+num2;}else if("-".equals(s)){sum=num1-num2;}else if("*".equals(s)){sum=num1*num2;}else if("/".equals(s)){sum=num1/num2;}
//                System.out.println(num1+s+num2+"="+sum);mathStack.push(sum);}else {mathStack.push(Integer.parseInt(s));}}return mathStack.pop();}

java实现逆波兰表达式求值相关推荐

  1. 【Java版oj】逆波兰表达式求值

    目录 一.原题再现 二.问题分析 三.完整代码 一.原题再现 150. 逆波兰表达式求值 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 注意 两个整数之间的除 ...

  2. LetCode: 150. 逆波兰表达式求值

    提示 LintCode中的相关算法题实现代码,可以在我的GithHub中下载. 题目需求 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另 ...

  3. 复习栈和队列,详解最小栈,栈的弹出压入序列,逆波兰表达式求值

    栈和队列的概念 栈:吃进去吐出来 对列:吃进去拉出来 数据结构中的栈和内存中的区别 数据结构中的栈具有后进先出的特性,而内存中的栈是一个内存空间,只不过这个内存空间具与数据结构的栈具有相同的特性. 栈 ...

  4. 数据结构链表之栈——解决括号匹配问题和逆波兰表达式求值问题——6

    括号匹配问题和逆波兰表达式求值问题 基于上一节已经使用python代码对栈进行了简单的实现,这一节我们在其基础上解决两个常见的问题 案例 括号匹配问题(点我直接到代码实现) 逆波兰表达式求值问题(点我 ...

  5. leetcode_150. 逆波兰表达式求值

    一.题目内容 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.* ./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的 ...

  6. Suzy找到实习了吗Day 11 |栈与队列中途 20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值

    Day 11 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值 20. 有效的括号 注意栈不是一个数据结构,需要自己用list实现栈的逻辑 class Solu ...

  7. (补)算法训练Day13 | LeetCode150. 逆波兰表达式求值(栈应用);LeetCode239. 滑动窗口最大值(单调队列);LeetCode347. 前K个高频元素(小顶堆,优先级队列)

    目录 LeetCode150. 逆波兰表达式求值 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考 LeetCode239. 滑动窗口最大值 1. 思路 2. 代码实现 3. 复杂度分析 4. ...

  8. 算法训练Day11|LeetCode 20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

    题目链接:20. 有效的括号 第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false 第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字 ...

  9. 代码随想录第11天 | LeetCode20. 有效的括号、LeetCode1047. 删除字符串中的所有相邻重复项、LeetCode150. 逆波兰表达式求值

    day11 | LeetCode20. 有效的括号.LeetCode1047. 删除字符串中的所有相邻重复项.LeetCode150. 逆波兰表达式求值 文章目录 day11 | LeetCode20 ...

  10. 算法训练第十一天|力扣20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值

    20. 有效的括号 题目链接:有效的括号 参考:https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B ...

最新文章

  1. AS3.0函数定义的方法
  2. ES6公用分页组件的封装及应用举例
  3. 机器学习性能度量(1):P-R曲线与ROC曲线,python sklearn实现
  4. python怎么设置颜色深浅变化_Python赋值、深浅copy
  5. 数据轮播图翻页封装(左右点击)
  6. Java 常见的 30 个误区与细节
  7. leetcode 52. N皇后 II(回溯)
  8. 01背包问题(DFS解法)
  9. 四大开源项目联合发布 腾讯已成Github全球贡献前十公司!
  10. [多图]Google Chrome漫画书中文版
  11. 剑指Offer之寻找链表倒数第k个节点
  12. wpf的控件style
  13. ASP.NET DROPDOWNLIST无刷新联动(中文URL参数处理)
  14. php页面不刷新 图片的src不更新,详解iframe的src指向的内容不刷新的解决办法
  15. 支付宝 错误代码 insufficient-isv-permissions 错误原因: ISV权限不足,建议在开发者中心检查签约是否已经生效
  16. ESP32的智能药箱-WEB定时-舵机和语音控制-OLED实时时间显示
  17. HTML表格之合并单元格
  18. 黑苹果完美升级mac10.13.6,更换内置无线网卡dw1820A
  19. C4D模型工具—连接点/边
  20. memory prefix hypo,hecto,hyper out1

热门文章

  1. Dezender的使用
  2. 使用Aircrack-ng和RT3070无线网卡破解WIFI密码
  3. 香农编码的gui编码_1、香农编码方法
  4. Mycat分库分表案例demo
  5. 游戏开发热门技术浅析
  6. 九宫格日记 2017年12月19日(周二)
  7. Struts2拦截器实现异常处理
  8. bmp格式如何转换成jpg?
  9. setup factory制作安装包卸载出错“Invalid start mode:archive filename”
  10. cisco下模拟Linux防火墙,Cisco防火墙HA实例