题目
根据 逆波兰表示法,求该后缀表达式的计算结果。
有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
思路
后缀表达式计算:
① 从左往右扫描下一个元素,直到处理完所有元素。
② 若扫描到操作数则压入栈,并回到①;否则执行③
③ 若扫描到运算符,则弹出两个栈顶元素,执行相应运算,运算结果压回栈顶,回到①
代码一:
class Solution {
public int evalRPN(String[] tokens) {
Stack<String> stack = new Stack<>();
for(int i = 0; i < tokens.length; i++) {
if(tokens[i].equals("+")) {
int n2 = Integer.parseInt(stack.pop());
int n1 = Integer.parseInt(stack.pop());
int val = n1 + n2;
stack.push(val + "");
}else if(tokens[i].equals("-")) {
int n2 = Integer.parseInt(stack.pop());
int n1 = Integer.parseInt(stack.pop());
int val = n1 - n2;
stack.push(val + "");
}else if(tokens[i].equals("*")) {
int n2 = Integer.parseInt(stack.pop());
int n1 = Integer.parseInt(stack.pop());
int val = n1 * n2;
stack.push(val + "");
}else if(tokens[i].equals("/")) {
int n2 = Integer.parseInt(stack.pop());
int n1 = Integer.parseInt(stack.pop());
int val = n1 / n2;
stack.push(val + "");
} else {
stack.push(tokens[i]);
}
}
return Integer.parseInt(stack.pop());
}
}
代码二(修改版):
class Solution {
public int evalRPN(String[] tokens) {
Stack<String> stack = new Stack<>();
for(int i = 0; i < tokens.length; i++) {
if(tokens[i].equals("+") || tokens[i].equals("-") || tokens[i].equals("*") || tokens[i].equals("/")) {
int n2 = Integer.parseInt(stack.pop());
int n1 = Integer.parseInt(stack.pop());
int val;
if(tokens[i].equals("+")) {
val = n1 + n2;
}else if(tokens[i].equals("-")) {
val = n1 - n2;
}else if(tokens[i].equals("*")) {
val = n1 * n2;
}else {
val = n1 / n2;
}
stack.push(val + "");
}else {
stack.push(tokens[i]);
}
}
return Integer.parseInt(stack.pop());
}
}
代码三:创建一个辅助集合
class Solution {
public int evalRPN(String[] tokens) {
Set<String> set = new HashSet<>(); //辅助集合,用于保存运算符
set.add("+");
set.add("-");
set.add("*");
set.add("/");
Stack<Integer> stack = new Stack<>();
for(String s : tokens) {
if(set.contains(s)) {
Integer n2 = stack.pop();
Integer n1 = stack.pop();
Integer val;
if(s.equals("+")) {
val = n1 + n2;
}else if(s.equals("-")) {
val = n1 - n2;
}else if(s.equals("*")) {
val = n1 * n2;
}else {
val = n1 / n2;
}
stack.push(val);
} else {
stack.push(Integer.valueOf(s));
}
}
return stack.pop();
}
}