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) = 9Example 2:
Input: ["4", "13", "5", "/", "+"] Output: 6 Explanation: (4 + (13 / 5)) = 6Example 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
逆波兰表达式求值。
根据 逆波兰表示法,求表达式的值。
有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
说明:
整数除法只保留整数部分。
给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/evaluate-reverse-polish-notation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路是用stack。注意到这里的所有计算并不遵循乘除法优先于加减法的原则,而是先遇到什么符号就立马进行计算。思路直接参见代码。
时间O(n)
空间O(n)
Java实现
1 class Solution { 2 public int evalRPN(String[] tokens) { 3 Stack<Integer> stack = new Stack<>(); 4 for (String s : tokens) { 5 if (s.equals("+")) { 6 stack.push(stack.pop() + stack.pop()); 7 } else if (s.equals("-")) { 8 int a = stack.pop(); 9 int b = stack.pop(); 10 stack.push(b - a); 11 } else if (s.equals("*")) { 12 stack.push(stack.pop() * stack.pop()); 13 } else if (s.equals("/")) { 14 int a = stack.pop(); 15 int b = stack.pop(); 16 stack.push(b / a); 17 } else { 18 stack.push(Integer.parseInt(s)); 19 } 20 } 21 return stack.pop(); 22 } 23 }