题目描述:
Evaluate the value of an arithmetic expression in Reverse Polish Notation.
Valid operators are+,-,*,/. Each operand may be an integer or another expression.
Some examples:
["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9
["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6
解释:
逆波兰表达式,也叫后缀表达式。
下面以(a+b)*c
为例子进行说明:
(a+b)*c
的逆波兰式为ab+c*
,假设计算机把ab+c*
按从左到右的顺序压入栈中,并且按照遇到运算符就把栈顶两个元素出栈,执行运算,得到的结果再入栈的原则来进行处理,那么ab+c*
的执行结果如下:
- a入栈(0位置);
- b入栈(1位置);
- 遇到运算符
“+”
,将a
和b
出栈,执行a+b
的操作,得到结果d=a+b
,再将d
入栈(0位置); - c入栈(1位置);
- 遇到运算符
“*”
,将d
和c
出栈,执行d*c
的操作,得到结果e
,再将e
入栈(0位置)。
经过以上运算,计算机就可以得到(a+b)*c
的运算结果e
了。
思路解析:
使用栈来解决这个问题,分两种情况:
- 数字的话直接push进去
- 符号的话就要看是什么符号,
进行计算,计算完毕再push到栈中。
代码:
import java.util.Stack;
public class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> s = new Stack<Integer>();
for(int i=0;i<tokens.length;i++){
switch(tokens[i]){
case "+":
s.push(s.pop()+s.pop());
break;
case "-":
int a1=s.pop();
int a2=s.pop();
s.push(a2-a1);
break;
case "*":
s.push(s.pop()*s.pop());
break;
case "/":
int b1=s.pop();
int b2=s.pop();
s.push(b2/b1);
break;
default:
s.push(Integer.parseInt(tokens[i]));
break;
}
}
return s.pop();
}
}
LeetCode