一、题目
给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
注意:
- 有效的算符为 '+'、'-'、'*' 和 '/' 。
- 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
- 两个整数之间的除法总是 向零截断 。
- 表达式中不含除零运算。
- 输入是一个根据逆波兰表示法表示的算术表达式。
- 答案及所有中间计算结果可以用 32 位 整数表示。
示例 1:
输入:tokens = ["2","1","+","3","*"] 输出:9 解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
示例 2:
输入:tokens = ["4","13","5","/","+"] 输出:6 解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6
提示:
- 1 <= tokens.length <= 104
- tokens[i] 是一个算符("+"、"-"、"*" 或 "/"),或是在范围 [-200, 200] 内的一个整数
二、代码
class Solution {
public int evalRPN(String[] tokens) {
int n = tokens.length;
// 自己构造栈
String[] stack = new String[n];
int top = -1;
// 遍历逆波兰表达式
for (int i = 0; i < n; i++) {
String str = tokens[i];
// 遇到数字压栈,遇到运算符弹出两个数计算,算完再压栈回去
if ("+".equals(str) || "-".equals(str) || "*".equals(str) || "/".equals(str)) {
int num1 = Integer.valueOf(stack[top--]);
int num2 = Integer.valueOf(stack[top--]);
// 弹出两个数进行运算,注意num2在前,num1在后
int ans = compute(num1, num2, str);
// 将运算结果压入栈中
stack[++top] = String.valueOf(ans);
} else {
// 碰到数字直接压栈
stack[++top] = str;
}
}
return Integer.valueOf(stack[top]);
}
// 将两个数进行计算,返回运算结果
public int compute(int num1, int num2, String operator) {
if ("+".equals(operator)) {
return num2 + num1;
} else if ("-".equals(operator)) {
return num2 - num1;
} else if ("*".equals(operator)) {
return num2 * num1;
} else {
return num2 / num1;
}
}
}
三、解题思路
逆波兰式可以表示任何一个有小括号结合的一个等式。计算方法就是遇到数字压栈,遇到运算符弹出两个数计算,算完再压栈回去。