[toc]
题目:https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
要求
根据 逆波兰表示法,求表达式的值。
有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
四则运算
分为三种
- 前缀表达式(prefix expression),又称为波兰表达式
- 运算符在前,后面的操作数字运算(二叉树前序遍历结果)
- 中缀表达式(infix expression)(二叉树中序遍历结果)
- 后缀表达式 (positfix expression),又称为逆波兰表达式(二叉树后序遍历结果)
- 运算符在后,前面的操作数字运算
前缀表达式 | 中缀表达式 | 后缀表达式 |
---|---|---|
+ 1 2 | 1 + 2 | 1 2 + |
+ 2 * 3 4 | 2 + 3 * 4 | 2 3 4 * + |
+ 9 * - 4 1 2 | 9 + (4-1)*2 | 9 4 1 - 2 * + |
思路
- 遇见数字,直接入栈
- 遇见符号
- 弹出栈顶的右操作数
- 弹出栈顶的左操作数
- 使用符号进行计算,讲计算结果入栈
- 最后占中的唯一数字就是后缀表达式的计算值
代码
class LeetCode150 {
static int evalRPN(List tokens) {
const List sysbols = ['+', '-', '*', '/'];
List numStack = [];
if (tokens == null && tokens.length == 0) return 0;
// int result = 0;
for (var item in tokens) {
if (!sysbols.contains(item)) {
numStack.add(int.parse(item));
} else {
int right = numStack.removeLast();
int left = numStack.removeLast();
switch (item) {
case "+":
numStack.add(left + right);
break;
case "-":
numStack.add(left - right);
break;
case "*":
numStack.add(left * right);
break;
case "/":
var t = (left.abs()) / (right.abs());
numStack.add(t.floor());
break;
default:
}
}
}
return numStack.last;
}
}
main(List args) {
List tokens = ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"];
print(LeetCode150.evalRPN(tokens));
}
执行结果结果
22