题目
根据 逆波兰表示法,求该后缀表达式的计算结果。
有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
说明:
- 整数除法只保留整数部分。
- 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
示例 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
提示:
1 <= tokens.length <= 104
tokens[i] 要么是一个算符(“+”、“-”、“*” 或 “/”),要么是一个在范围 [-200, 200] 内的整数
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/8Zf90G
一、栈
解题思路:
定义一个栈,存储操作数,从左至右遍历后缀表达式数组:
- 当遇到操作数,则压入栈
- 当遇到操作符,弹出前两个操作数,并进行运算,把运算结果压入栈
运行至最后,栈中会只存在一个数,即是结果
代码如下:
class Solution {
public int evalRPN(String[] tokens) {
Deque<Integer> eq = new LinkedList<>();
int n = tokens.length;
for(int i=0;i<n;i++){
String token = tokens[i];
if(isNumber(token)) eq.push(Integer.parseInt(token));
else{
int b = eq.pop();
int a = eq.pop();
switch(token){
case "+":
eq.push(a+b);
break;
case "-":
eq.push(a-b);
break;
case "*":
eq.push(a*b);
break;
case "/":
eq.push(a/b);
break;
}
}
}
return eq.pop();
}
//判断是否为操作数
public boolean isNumber(String s){
return !("+".equals(s)||"-".equals(s)||"*".equals(s)||"/".equals(s));
}
}
二、数组模拟栈
根据栈方法的思想,
定义一个数组stack存储操作数
而对于数组则需要预定义数组大小,对于一个有效的后缀表达式,其长度大小必定为奇数,且操作数比操作符的个数多一个,所以最坏情况下stack数组内元素最多时可为(n+1)/2.
定义index下标始终指向stack数组中最后一位有效数
运算到最后stack数组只有一个数,输出stack[0]
代码如下:
class Solution {
//数组模拟栈
public int evalRPN(String[] tokens) {
int n = tokens.length;
int[] stack = new int[(n+1)/2];
int index = -1;
for(int i=0;i<n;i++){
String token = tokens[i];
switch(token){
case "+":
stack[--index]=stack[index]+stack[index+1];
break;
case "-":
stack[--index]=stack[index]-stack[index+1];
break;
case "*":
stack[--index]=stack[index]*stack[index+1];
break;
case "/":
stack[--index]=stack[index]/stack[index+1];
break;
default:
stack[++index]=Integer.parseInt(token);
}
}
return stack[0];
}
}
加深栈方法使用:
剑指 Offer II 037. 小行星碰撞(栈)
剑指 Offer II 038. 每日温度(单调栈)
参考力扣解析:
https://leetcode-cn.com/problems/8Zf90G/solution/hou-zhui-biao-da-shi-by-leetcode-solutio-39j5/
侵删