Evaluate Reverse Polish Notation
Description
Evaluate the value of an arithmetic expression in Reverse Polish Notation.
Valid operators are +
, -
, *
, /
. Each operand may be an integer or another expression.
Note:
- Division between two integers should truncate toward zero.
- The given RPN expression is always valid. That means the expression would always evaluate to a result and there won't be any divide by zero operation.
Example 1:
Input: ["2", "1", "+", "3", "*"] Output: 9 Explanation: ((2 + 1) * 3) = 9
Example 2:
Input: ["4", "13", "5", "/", "+"] Output: 6 Explanation: (4 + (13 / 5)) = 6
Example 3:
Input: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"] Output: 22 Explanation: ((10 * (6 / ((9 + 3) * -11))) + 17) + 5 = ((10 * (6 / (12 * -11))) + 17) + 5 = ((10 * (6 / -132)) + 17) + 5 = ((10 * 0) + 17) + 5 = (0 + 17) + 5 = 17 + 5 = 22
Solution(javascript)
/**
* @param {string[]} tokens
* @return {number}
*/
const evalRPN = function (tokens) {
const stack = []
const isOperator = token => token === '+' || token === '-' || token === '*' || token === '/'
for (const token of tokens) {
if (isOperator(token)) {
const b = stack.pop()
const a = stack.pop()
let result = 0
switch (token) {
case '+':
result = a + b
break
case '-':
result = a - b
break
case '/':
result = a / b
result = result < 0 ? Math.ceil(result) : Math.floor(a / b) // 注意负数向上取整
break
default:
result = a * b
}
stack.push(result)
} else {
stack.push(parseInt(token, 10))
}
}
return stack[0]
}