当前位置: 面试刷题>> 逆波兰表达式求值(经典算法150题)


### 题目描述 逆波兰表达式(Reverse Polish Notation, RPN),也被称为后缀表达式,是一种不需要括号来标识运算符优先级的数学表示法。在这种表示法中,所有操作数都位于运算符之前。例如,表达式 `(3 + 4) * 2` 在逆波兰表示法中为 `3 4 + 2 *`。 **题目要求**: 实现一个函数来计算逆波兰表达式的值。函数接收一个字符串数组作为参数,其中每个元素是一个数字或运算符(`+`, `-`, `*`, `/`)。假设除法运算的结果总是整数,并且除法运算中的除数不为零。 ### 示例 输入: `["2", "1", "+", "3", "*"]` 输出: 9 解释: ((2 + 1) * 3) = 9 ### PHP 示例代码 ```php function evalRPN($tokens) { $stack = []; foreach ($tokens as $token) { if (is_numeric($token)) { $stack[] = intval($token); } else { $operand2 = array_pop($stack); $operand1 = array_pop($stack); switch ($token) { case '+': $stack[] = $operand1 + $operand2; break; case '-': $stack[] = $operand1 - $operand2; break; case '*': $stack[] = $operand1 * $operand2; break; case '/': // 假设除法结果总是整数 $stack[] = intval($operand1 / $operand2); break; } } } return $stack[0]; } // 测试示例 $tokens = ["2", "1", "+", "3", "*"]; echo evalRPN($tokens); // 输出 9 ``` ### Python 示例代码 ```python def evalRPN(tokens): stack = [] for token in tokens: if token.isdigit(): stack.append(int(token)) else: operand2 = stack.pop() operand1 = stack.pop() if token == '+': stack.append(operand1 + operand2) elif token == '-': stack.append(operand1 - operand2) elif token == '*': stack.append(operand1 * operand2) elif token == '/': # 假设除法结果总是整数 stack.append(int(operand1 / operand2)) return stack[0] # 测试示例 tokens = ["2", "1", "+", "3", "*"] print(evalRPN(tokens)) # 输出 9 ``` ### JavaScript 示例代码 ```javascript function evalRPN(tokens) { const stack = []; tokens.forEach(token => { if (!isNaN(token)) { stack.push(parseInt(token)); } else { const operand2 = stack.pop(); const operand1 = stack.pop(); switch (token) { case '+': stack.push(operand1 + operand2); break; case '-': stack.push(operand1 - operand2); break; case '*': stack.push(operand1 * operand2); break; case '/': // 假设除法结果总是整数 stack.push(Math.trunc(operand1 / operand2)); break; } } }); return stack[0]; } // 测试示例 const tokens = ["2", "1", "+", "3", "*"]; console.log(evalRPN(tokens)); // 输出 9 ``` 以上代码示例展示了如何在 PHP、Python 和 JavaScript 中实现逆波兰表达式的求值。这些代码都遵循了相同的逻辑:遍历表达式中的每个元素,将数字推入栈中,遇到运算符则从栈中弹出两个操作数,执行运算后再将结果推回栈中,最后栈中剩下的元素即为表达式的值。
推荐面试题