根据 逆波兰表示法,求该后缀表达式的计算结果。
有效的算符包括 +
、-
、*
、/
。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
逆波兰表达式具有以下几个优点:
- 易于计算机解析:由于不需要处理括号和运算符优先级,计算机解析逆波兰表达式比解析传统表达式更加直接和快速。
- 适合栈操作:逆波兰表达式可以很容易地使用栈(Stack)数据结构来求值。每当读取到一个操作数时,就将其压入栈中;当读取到一个操作符时,就从栈中弹出相应数量的操作数,应用操作符进行计算,并将结果再压回栈中。
- 无歧义性:由于操作符的位置固定在其操作数之后,逆波兰表达式消除了传统表达式中由于运算符优先级和括号导致的歧义。
逆波兰表达式的求值过程通常如下:
- 初始化一个空栈。
- 从左到右扫描逆波兰表达式。
- 如果读取到操作数,则将其压入栈中。
- 如果读取到操作符,则从栈中弹出相应数量的操作数(操作符的元数决定弹出的操作数个数),应用操作符进行计算,并将结果压回栈中。
- 重复步骤 2-4,直到表达式扫描完毕。
- 此时栈中应该只剩下一个元素,即为表达式的结果。
那么我们就可以根据这些特性来写出代码完成操作
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> stack=new Stack();
for(int i=0;i<tokens.length;i++){
if(tokens[i].equals("+") || tokens[i].equals("-") || tokens[i].equals("*") || tokens[i].equals("/")){
int num2=stack.pop();
int num1=stack.pop();
if(tokens[i].equals("+")){
stack.push(num1+num2);
}
if(tokens[i].equals("-")){
stack.push(num1-num2);
}
if(tokens[i].equals("*")){
stack.push(num1*num2);
}
if(tokens[i].equals("/")){
stack.push(num1/num2);
}
}
else{
stack.push(Integer.parseInt(tokens[i]));
}
}
return stack.pop();
}
}
注意先取出来的是num2,接下来才是num1,因为栈是先进后出的。这对除法运算和减法运算是存在着差异的。