后缀表达式也称为逆波兰表达式,即运算符写在后面
从左向右进行计算
不必考虑运算符优先级,即不用包含括号
示例
输入:tokens = ["2","1","+","3","*"]
输出:9
即:(2 + 1) * 3
输入:tokens = ["4","13","5","/","+"]
输出:6
即:4 + (13 / 5)
题目假设
数字都视为整数
数字和运算符个数给定正确,不会有除零发生
/*
什么叫中缀、后缀?
答: 1 + 2 :中缀
1 2 + :后缀
"4","13","5","/","+"
第一步: | 5 | ----顶部
| 13|
| 4 | ----底部
_____
第二步: | 5 | ----顶部
| 13|
| 4 | ----底部
第三步: | 5 | ----顶部
| 13|
| 4 | ----底部
将5、13 pop()出来然后继续“/”操作,将"/"操作后的结果(13/5==2)再压栈
第四步: | | ----顶部
| 2 |
| 4 | ----底部
_____
将2、4 pop()出来然后继续“+”操作,将"+"操作后的结果(2+4==6)再压栈
"4","13","5","/","+"
第五步:当字符串都执行完毕以后,栈中就只剩下最后的结果值
- 遇到数字压入栈
- 遇到运算符, 就从栈弹出两个数字做运算, 将结果压入栈
- 遍历结束, 栈中剩下的数字就是结果
*/
代码:
public int evalRPN(String[] tokens) {
LinkedList<Integer> numbers = new LinkedList<>();
for (String t : tokens) {
switch (t) {
case "+" -> {
Integer b = numbers.pop();
Integer a = numbers.pop();
numbers.push(a + b);
}
case "-" -> {
Integer b = numbers.pop();
Integer a = numbers.pop();
numbers.push(a - b);
}
case "*" -> {
Integer b = numbers.pop();
Integer a = numbers.pop();
numbers.push(a * b);
}
case "/" -> {
Integer b = numbers.pop();
Integer a = numbers.pop();
numbers.push(a / b);
}
//t是字符串,所以我们要转换成数字再压栈
default -> numbers.push(Integer.parseInt(t));
}
}
return numbers.pop();
}
另外一种:
public int evalRPN(String[] tokens) {
LinkedList<Integer> numbers = new LinkedList<>();
for (String t : tokens) {
switch (t) {
case "+" :{
Integer b = numbers.pop();
Integer a = numbers.pop();
numbers.push(a + b);
break;
}
case "-" : {
Integer b = numbers.pop();
Integer a = numbers.pop();
numbers.push(a - b);
break;
}
case "*" : {
Integer b = numbers.pop();
Integer a = numbers.pop();
numbers.push(a * b);
break;
}
case "/" : {
Integer b = numbers.pop();
Integer a = numbers.pop();
numbers.push(a / b);
break;
}
//t是字符串,所以我们要转换成数字再压栈
default :numbers.push(Integer.parseInt(t));
}
}
return numbers.pop();
}
测试用例:
public static void main(String[] args) {
String[] tokens={"10","6","9","3","+","-11","*","/","*","17","+","5","+"};
System.out.println(new E02LetCode150().evalRPN(tokens));
}