一、题目描述
给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
注意:
·有效的算符为 '+'、'-'、'*' 和 '/' 。
·每个操作数(运算对象)都可以是一个整数或者另一个表达式。
·两个整数之间的除法总是 向零截断 。
·表达式中不含除零运算。
·输入是一个根据逆波兰表示法表示的算术表达式。
·答案及所有中间计算结果可以用 32 位 整数表示。
示例 1:
输入:tokens = ["2","1","+","3","*"]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
示例 2:
输入:tokens = ["4","13","5","/","+"]
输出:6
解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6
示例 3:
输入:tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]
输出:22
解释:该算式转化为常见的中缀算术表达式为:
((10 * (6 / ((9 + 3) * -11))) + 17) + 5
= ((10 * (6 / (12 * -11))) + 17) + 5
= ((10 * (6 / -132)) + 17) + 5
= ((10 * 0) + 17) + 5
= (0 + 17) + 5
= 17 + 5
= 22
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、运行结果
三、解题思路
这题的解题思路并不难,具体的解题思路可以参考这篇博客:https://blog.csdn.net/LJH132465/article/details/123299290
代码中也有比较多的注释,知道原理的话应该完全可以看懂代码。
四、AC代码
class Solution {
public int evalRPN(String[] tokens) {
int len = tokens.length;
Map<String, Integer> opMap = new HashMap<>(); //操作符对应的优先级,同时也可以作为判断tokens中的项是否为操作符
opMap.put("+", 1); // 数字越大,优先级越高
opMap.put("-", 1);
opMap.put("*", 2);
opMap.put("/", 2);
Deque<Integer> nums = new LinkedList<>(); //操作数栈
//栈顶数作为表达式第二个操作数,次栈顶数字作为表达式第一个操作数
for(int i=0; i<len; i++){
if(!opMap.containsKey(tokens[i])){ // 操作数
int num = Integer.valueOf(tokens[i]); // 转换为数字
nums.push(num);
}
else { // 操作符
int num2 = nums.pop(); // 栈顶元素——>第二个操作数
int num1 = nums.pop(); // 次栈顶元素——>第一个操作数
int res;
if(tokens[i].equals("+")){
res = num1 + num2;
} else if(tokens[i].equals("-")){
res = num1 - num2;
} else if(tokens[i].equals("*")) {
res = num1 * num2;
} else {
res = num1 / num2;
}
nums.push(res);
}
}
return nums.peek(); // 最后栈中必然只剩下一个数,这个数就是整个表达式的计算结果
}
}