题目描述
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计算后缀表达式。
解题思路
逆波兰表达式(Evaluate Reverse Polish Notation)又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,所以,这种表示法也称为中缀表示。波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法。按此方法,每一运算符都置于其运算对象之后,故称为后缀表示。
一看此题,肯定想到了栈。每次取栈顶的两个数进行运算将运算结果置入栈中,最终栈中仅剩的一个元素为表达式的结果。
代码
public int evalRPN(String[] tokens) {
Stack<Integer> stack = new Stack<Integer>();
String tempStr;
for(int i = 0;i < tokens.length;i++){
tempStr = tokens[i];
if(tempStr.equals("+") || tempStr.equals("-") ||tempStr.equals("*") ||tempStr.equals("/") ){
int num2 = stack.pop();
int num1 = stack.pop();
int result = 0;
if(tempStr.equals("+")){
result = num1 + num2;
} else if(tempStr.equals("-")){
result = num1 - num2;
} else if(tempStr.equals("*")){
result = num1 * num2;
} else if(tempStr.equals("/")){
result = num1 / num2;
}
stack.push(result);
} else {
stack.push(Integer.valueOf(tokens[i]));
}
}
return stack.pop();
}