1. 问题描述
- 描述:逆波兰表达式求值
- 输入:逆波兰表达式数组
- 输出:最后的结果
2. 解题思路
- 关键点:如果当前字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈,最后当表达式扫描完后,栈里的就是结果。
- 解题步骤:
- javascript
var evalRPN = function (tokens) {
let stack = []
for (let token of tokens) {
let t = Number(token);
if (isNaN(t)) {
let n1 = stack.pop();
let n2 = stack.pop();
switch (token) {
case '+':
stack.push(n2 + n1);
break;
case '-':
stack.push(n2 - n1);
break;
case '*':
stack.push(n2 * n1);
break;
case '/':
let d = n2 / n1;
if (d < 0) {
d = - Math.floor(-d);
}else{
d = Math.floor(d);
}
stack.push(d);
break;
}
} else {
stack.push(t);
}
}
return stack[0];
};
class Solution:
def evalRPN(self, tokens) -> int:
stack = []
for token in tokens:
if token == '+':
n1 = stack.pop()
n2 = stack.pop()
stack.append(n2 + n1)
elif token == '-':
n1 = stack.pop()
n2 = stack.pop()
stack.append(n2 - n1)
elif token == '*':
n1 = stack.pop()
n2 = stack.pop()
stack.append(n2 * n1)
elif token == '/':
n1 = stack.pop()
n2 = stack.pop()
if n2 // n1 < 0:
stack.append(-(abs(n2) // abs(n1)))
else:
stack.append(n2 // n1)
else:
stack.append(int(token))
return stack[0]
3. 小细节