使用堆栈解决逆波兰表达式
什么是逆波兰表达式
"逆波兰式"也叫后缀表达式(将运算符写在操作符之后),例如:"2,1,+,3,*"为逆波兰表达式。
解析时我们安装从左向右的顺序完成解析:
- 遇到+号,将2和1相加,即: 2+1 =3;
- 遇到*号, 将之前结果 * 3 = 3*3 = 9
- 结果为9
如何用堆栈解决逆波兰表达式
如下图所示,当我们从左侧向右侧扫描入栈过程中,执行以下步骤:
- 如果为数字压入栈中
- 如果为字母(+, - ,* ,/)则从栈中弹出两个数据进行运算
- 将运算结果再次压入栈中。
力扣题目实践
参考实现
【思路】 从头开始扫描tokens数组
- 如果字符串为+,- ,*,/则从栈中弹出两个元素(tips:注意减法,除法有顺序)
- 如果字符串是数值(可能有负数值),则将字符串转换为整数入栈。
- 重复执行1,2,直到字符串数组tokens扫描完毕。
- 弹出stack中最后一个数据stack.pop()即为计算结果。
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> stack = new Stack<>();
for (String str : tokens) {
switch (str) {
case "+":
stack.push(stack.pop() + stack.pop());
break;
case "*":
stack.push(stack.pop() * stack.pop());
break;
case "-":
stack.push((stack.pop() - stack.pop()) * (-1));
break;
case "/":
int a = stack.pop();
stack.push(stack.pop() / a);
break;
default:
stack.push(Integer.valueOf(str));
}
}
return stack.pop();
}
}