题目链接:https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
思路:首先逆波兰表达式求值没有计算符号优先级问题,碰到计算符号,栈中pop出两个数计算即可。注意:第二个pop出的数在运算符前,第一个pop出的数在运算符后,别弄反了!!!
举个例子: 2 1 - 3 *
步骤 | 栈中元素 | 说明 |
---|---|---|
1 | 2 | 2进栈 |
2 | 21 | 1进栈 |
3 | 1 | 碰到运算符‘-’,1出栈,2出栈,计算2-1=1,1入栈 |
4 | 13 | 3进栈 |
5 | 3 | 碰到运算符‘*’,3出栈,1出栈,计算1*3=3,3入栈 |
栈中最后一个元素就是最终结果(3就是最终结果)。
上代码:
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> stack = new Stack<>();
int len = tokens.length;
for (int i = 0; i < len; i++) {
//判断是不是+-*/符号
if (tokens[i].length() == 1 && !Character.isDigit(tokens[i].charAt(0))) {
char op = tokens[i].charAt(0);
//第一个pop出的数在运算符后
int after = stack.pop();
//第二个pop出的数在运算符前
int pre = stack.pop();
if (op == '+') {
stack.push(pre + after);
} else if (op == '-') {
stack.push(pre - after);
} else if (op == '*') {
stack.push(pre * after);
} else if (op == '/') {
stack.push(pre / after);
}
} else {
stack.push(Integer.valueOf(tokens[i]));
}
}
//返回栈中最后一个元素,即为最终结果
return stack.pop();
}
}