计算逆波兰式(后缀表达式)的值
运算符仅包含"+","-","*“和”/",被操作数可能是整数或其他表达式
例如: [“2”, “1”, “+”, “3”, “*”] -> ((2 + 1) * 3) -> 9 [“4”, “13”,
“5”, “/”, “+”] -> (4 + (13 / 5)) -> 6
function evalRPN(tokens) {
const operation = {
'+': (a, b) => a + b,
'-': (a, b) => a - b,
'*': (a, b) => a * b,
'/': (a, b) => {if (b<0) {
return 0
}else{
return parseInt(a/b)
}}
}
const stack = []
for (let i = 0; i < tokens.length; i++) {
if (tokens[i] in operation) {
if (stack.length >= 2) {
const b = Number(stack.pop())
const a = Number(stack.pop())
const result = operation[tokens[i]](a, b)
stack.push(result)
} else {
return 0
}
} else {
stack.push(tokens[i])
}
}
return stack.pop()
}
理解:这里写的时候有几个问题
1.后缀表达式先出来的值为b,后出来的为a,然后进行a op b计算
2.operation是一个对象,里面定义了一些方法,所以应该是先operation[tokens[i]]再传参,类似前面讲过的obj[a]和obj.a是一样的
3.要考虑到异常的情况,比如最后栈内操作数不够了,但是还有运算符;比如除数为0
4.测试用例的时候会发现,除法运算取整了,所以需要使用parseInt(a/b)