一、题目描述
二、思路分析
2.1 分析
本题其实已经把解题思路说明白了,值得注意的是减法和除法中运算的两个数的前后位置。对于给定的逆波兰表达式,例如:["4", "13", "5", "/", "+"]。遍历该逆波兰表达式,遇到数字,直接入栈,栈内现在元素为[4, 13, 5]。当遇到运算符"/"时,取出栈顶的两个元素,分别是 5 和 13,**将 13 / 5 ** 即 2 结果放回栈内。遇到运算符"+",取出栈顶的两个元素,分别是 2 和 4,将 2 + 4 即 6 结果放回栈。此时表达式遍历完毕,返回栈内元素,即结果。
2.2 图解
- 参考程序员吴师兄逆波兰表达式的动画演示
三、题解
- 逆波兰表达式的实现
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> stack = new Stack<>();
for (String token : tokens) {
switch (token) {
// 遇到 + - * / 将栈内的数字出栈两个,计算结果,放回栈中(注意一下 - / 的运算顺序)
case "+":
stack.push(stack.pop() + stack.pop());
break;
// 减法注意运算顺序
case "-":
int num2 = stack.pop();
stack.push(stack.pop() - num2);
break;
case "*":
stack.push(stack.pop() * stack.pop());
break;
// 除法注意运算顺序
case "/":
int divisor = stack.pop();
stack.push(stack.pop() / divisor);
break;
// 遇到数字直接入栈
default:
stack.push(Integer.parseInt(token));
}
}
// 剩下在栈的就是结果啦
return stack.pop();
}
}