[LeetCode] 150. Evaluate Reverse Polish Notation

Evaluate the value of an arithmetic expression in Reverse Polish Notation.

Valid operators are +-*, and /. Each operand may be an integer or another expression.

Note that division between two integers should truncate toward zero.

It is guaranteed that the given RPN expression is always valid. That means the expression would always evaluate to a result, and there will not be any division by zero operation.

Example 1:

Input: tokens = ["2","1","+","3","*"]
Output: 9
Explanation: ((2 + 1) * 3) = 9

Example 2:

Input: tokens = ["4","13","5","/","+"]
Output: 6
Explanation: (4 + (13 / 5)) = 6

Example 3:

Input: tokens = ["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

Constraints:

  • 1 <= tokens.length <= 104
  • tokens[i] is either an operator: "+""-""*", or "/", or an integer in the range [-200, 200].

逆波兰表达式求值。

根据 逆波兰表示法,求表达式的值。

有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。

注意 两个整数之间的除法只保留整数部分。

可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。

来源:力扣(LeetCode)
链接:https://leetcode.cn/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 }

 

LeetCode 题目总结

posted @ 2020-05-16 11:52  CNoodle  阅读(456)  评论(0编辑  收藏  举报