题目:
根据 逆波兰表示法,求表达式的值。
有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
实例:
输入: [“2”, “1”, “+”, “3”, “*”]
输出: 9
解释: 该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
解题思路:
逆波兰表达式由 "value ,value ,operator"其中value可以是数字也可以是"value ,value ,operator"这样的形式嵌套组成。它的特点是把运算符放在了两个运算数的后边。
计算这种式子的值可以用一个栈存放数值,遇到一个运算符就把栈最后两个元素取出,进行该运算符的运算后再放回栈中。
整体上由switch case完成整个对逆波兰表达式每个符号的判断,最后进行运算的结果就是该表达式的值。
代码:
public static int evalRPN(String[] tokens) {
Stack<Integer> numStack = new Stack<>();
Integer op1, op2;
for (String s : tokens) {
switch (s) {
case "+"://遇到一次符号先把栈尾两个元素弹出进行运算操作,再入栈
op2 = numStack.pop();
op1 = numStack.pop();
numStack.push(op1 + op2);
break;
case "-":
op2 = numStack.pop();
op1 = numStack.pop();
numStack.push(op1 - op2);
break;
case "*":
op2 = numStack.pop();
op1 = numStack.pop();
numStack.push(op1 * op2);
break;
case "/":
op2 = numStack.pop();
op1 = numStack.pop();
numStack.push(op1 / op2);
break;
default://数字的话直接放入栈中
numStack.push(Integer.valueOf(s));
break;
}
}
//最后一次运算的结果就是最终的结果
return numStack.pop();
}