算法:Evaluate Reverse Polish Notation(逆波兰表达式求值)
说明
算法: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(逆波兰表达式求值)相关推荐
- 【数据结构与算法】之深入解析“逆波兰表达式求值”的求解思路与算法示例
一.题目要求 根据逆波兰表示法,求表达式的值.有效的算符包括 +.-.*./,每个运算对象可以是整数,也可以是另一个逆波兰表达式. 两个整数之间的除法只保留整数部分. 可以保证给定的逆波兰表达式总是有 ...
- (补)算法训练Day13 | LeetCode150. 逆波兰表达式求值(栈应用);LeetCode239. 滑动窗口最大值(单调队列);LeetCode347. 前K个高频元素(小顶堆,优先级队列)
目录 LeetCode150. 逆波兰表达式求值 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考 LeetCode239. 滑动窗口最大值 1. 思路 2. 代码实现 3. 复杂度分析 4. ...
- 算法训练Day11|LeetCode 20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值
题目链接:20. 有效的括号 第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false 第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字 ...
- 算法训练第十一天|力扣20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值
20. 有效的括号 题目链接:有效的括号 参考:https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B ...
- 数据结构链表之栈——解决括号匹配问题和逆波兰表达式求值问题——6
括号匹配问题和逆波兰表达式求值问题 基于上一节已经使用python代码对栈进行了简单的实现,这一节我们在其基础上解决两个常见的问题 案例 括号匹配问题(点我直接到代码实现) 逆波兰表达式求值问题(点我 ...
- LetCode: 150. 逆波兰表达式求值
提示 LintCode中的相关算法题实现代码,可以在我的GithHub中下载. 题目需求 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另 ...
- JavaScript逆波兰表达式求值
逆波兰表达式简介 逆波兰表达式又叫做后缀表达式.逆波兰表示法是波兰逻辑学家J・卢卡西维兹(J・ Lukasiewicz)于1929年首先提出的一种表达式的表示方法 .后来,人们就把用这种表示法写出的表 ...
- 复习栈和队列,详解最小栈,栈的弹出压入序列,逆波兰表达式求值
栈和队列的概念 栈:吃进去吐出来 对列:吃进去拉出来 数据结构中的栈和内存中的区别 数据结构中的栈具有后进先出的特性,而内存中的栈是一个内存空间,只不过这个内存空间具与数据结构的栈具有相同的特性. 栈 ...
- leetcode_150. 逆波兰表达式求值
一.题目内容 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.* ./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的 ...
- Suzy找到实习了吗Day 11 |栈与队列中途 20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值
Day 11 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值 20. 有效的括号 注意栈不是一个数据结构,需要自己用list实现栈的逻辑 class Solu ...
最新文章
- uva 1416 (SPFA) **月赛第E题的原题**
- red5安装时候出现服务不能启动异常
- UA MATH566 统计理论 证明UMVUE的方法
- JZOJ 1220. Pla
- TypeScript Parameter Destructuring 语法 - 参数解构
- Generative Adversarial Learning Towards Fast Weakly Supervised Detection(CVPR2018)阅读笔记
- Jquery需要掌握的技巧
- go语言通道插入0_使用Go语言常遇到的问题
- 用JSLint+Ant检验HTML代码
- IOS中设置圆角图片
- OpenGL基础43:抗锯齿
- 会计行业最新的法律和准则
- Java代码练习1 智能开关灯
- 教你如何把软件转移到另一台电脑?
- java泛型笔记2--上界通配符
- Python工作好找吗?没有工作经验和学历怎么找?【就业必看】
- 伞源科技Pinpoint和sonarQube对比
- 解开My SQL workbench安全模式
- windows下的ntsd命令
- 移动距离 奇妙的数字
热门文章
- win nginx html 配置,Windows服务器nginx安装与配置
- 二维均匀分布的边缘密度函数_均匀分布
- 属性篇(4)—If you love css …
- Android Studio 3.3发布:官方支持导航编辑器
- 选择排序之python实现
- python+selenium常见坑
- jQuery-可收缩面板
- 使Ubuntu登陆时默认开NumLock灯
- Why need to use 【com.opensymphony.xwork2.Preparable】
- 命令行方式添加打印机是比较简单的,现在我的问题是这样的,