说明

算法:Evaluate Reverse Polish Notation
LeetCode地址:https://leetcode.com/problems/evaluate-reverse-polish-notation/

题目:
Evaluate the value of an arithmetic expression in Reverse Polish Notation.

Valid operators are +, -, *, /. Each operand may be an integer or another expression.

Note:

Division between two integers should truncate toward zero.
The given RPN expression is always valid. That means the expression would always evaluate to a result and there won’t be any divide by zero operation.
Example 1:

Input: ["2", "1", "+", "3", "*"]
Output: 9
Explanation: ((2 + 1) * 3) = 9

Example 2:

Input: ["4", "13", "5", "/", "+"]
Output: 6
Explanation: (4 + (13 / 5)) = 6

Example 3:

Input: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]
Output: 22
Explanation: ((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

解题思路

逆波兰表达式求值实际上是遇到加减乘除符号,跟符号最近的数字先计算。
如果是加号、乘号那么左右顺序无关,减号、除号则最近的数字在右边。
所以用栈就很好处理上面计算,数字入栈,遇到符号则把数字出栈。
时间复杂度为 O(N)。

代码实现

import java.util.Stack;public class EvaluateReversePolishNotation {public int evalRPN(String[] tokens) {Stack<Integer> stack = new Stack<>();int temp = 0;for (String s: tokens) {if (s.equals("+")) {temp = stack.pop() + stack.pop();} else  if (s.equals("-")) {int right = stack.pop();int left = stack.pop();temp = left - right;} else if (s.equals("*")) {temp = stack.pop() * stack.pop();} else if (s.equals("/")) {int right = stack.pop();int left = stack.pop();temp = left / right;} else  {temp = Integer.parseInt(s);}stack.push(temp);}return temp;}public static void main(String[] args) {EvaluateReversePolishNotation obj = new EvaluateReversePolishNotation();String[] input = {"2", "1", "+", "3", "*"};System.out.println("ouput: " + obj.evalRPN(input));}
}

运行结果

ouput: 9

代码执行效率

Runtime: 6 ms, faster than 90.38% of Java online submissions for Evaluate Reverse Polish Notation.
Memory Usage: 37.1 MB, less than 33.65% of Java online submissions for Evaluate Reverse Polish Notation.

总结

考查栈的运用,小心减法、除法的数字位置问题。

代码下载:
https://github.com/zgpeace/awesome-java-leetcode/blob/master/code/LeetCode/src/popular/EvaluateReversePolishNotation.java

算法:Evaluate Reverse Polish Notation(逆波兰表达式求值)相关推荐

  1. 【数据结构与算法】之深入解析“逆波兰表达式求值”的求解思路与算法示例

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

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

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

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

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

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

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

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

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

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

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

  7. JavaScript逆波兰表达式求值

    逆波兰表达式简介 逆波兰表达式又叫做后缀表达式.逆波兰表示法是波兰逻辑学家J・卢卡西维兹(J・ Lukasiewicz)于1929年首先提出的一种表达式的表示方法 .后来,人们就把用这种表示法写出的表 ...

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

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

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

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

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

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

最新文章

  1. uva 1416 (SPFA) **月赛第E题的原题**
  2. red5安装时候出现服务不能启动异常
  3. UA MATH566 统计理论 证明UMVUE的方法
  4. JZOJ 1220. Pla
  5. TypeScript Parameter Destructuring 语法 - 参数解构
  6. Generative Adversarial Learning Towards Fast Weakly Supervised Detection(CVPR2018)阅读笔记
  7. Jquery需要掌握的技巧
  8. go语言通道插入0_使用Go语言常遇到的问题
  9. 用JSLint+Ant检验HTML代码
  10. IOS中设置圆角图片
  11. OpenGL基础43:抗锯齿
  12. 会计行业最新的法律和准则
  13. Java代码练习1 智能开关灯
  14. 教你如何把软件转移到另一台电脑?
  15. java泛型笔记2--上界通配符
  16. Python工作好找吗?没有工作经验和学历怎么找?【就业必看】
  17. 伞源科技Pinpoint和sonarQube对比
  18. 解开My SQL workbench安全模式
  19. windows下的ntsd命令
  20. 移动距离 奇妙的数字

热门文章

  1. win nginx html 配置,Windows服务器nginx安装与配置
  2. 二维均匀分布的边缘密度函数_均匀分布
  3. 属性篇(4)—If you love css …
  4. Android Studio 3.3发布:官方支持导航编辑器
  5. 选择排序之python实现
  6. python+selenium常见坑
  7. jQuery-可收缩面板
  8. 使Ubuntu登陆时默认开NumLock灯
  9. Why need to use 【com.opensymphony.xwork2.Preparable】
  10. 命令行方式添加打印机是比较简单的,现在我的问题是这样的,