150. 逆波兰表达式求值

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

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

说明:

整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。 示例 1:

输入: [“2”, “1”, “+”, “3”, “*"] 输出: 9 解释: ((2 + 1) * 3) = 9

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/evaluate-reverse-polish-notation 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:

思路: 遍历数组,当时数字时入栈,当是运算符是弹出栈顶两个元素,运算,并将结果入栈。 遍历完毕,栈顶元素即是结果。

代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public int evalRPN(String[] tokens){

        final HashSet<String> symbols = new HashSet<String>(){{
            add("+");
            add("-");
            add("*");
            add("/");
        }};

        Stack<String> stack = new Stack<>();
        for (int i = 0; i < tokens.length; i++) {
            String s = tokens[i];
            if (symbols.contains(s)){
                int num1 = Integer.parseInt(stack.pop());
                int num2 = Integer.parseInt(stack.pop());

                int res = 0;
                if (s.equals("+")){
                    res = num2 + num1;
                }else if (s.equals("-")){
                    res = num2 - num1;
                }else if (s.equals("*")){
                    res = num2 * num1;
                }else {
                    res = num2 / num1;
                }

                stack.push(String.valueOf(res));
            }else{
                stack.push(s);
            }
        }

        return Integer.parseInt(stack.peek());
    }

时间复杂度: O(N)

空间复杂度:O(N)

另一种写法:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public int evalRPN(String[] tokens){
        
        Stack<Integer> stack = new Stack<>();
        for (int i = 0; i < tokens.length; i++) {
            String s = tokens[i];
    
                if (s.equals("+")){
                    stack.push(stack.pop() + stack.pop());
                }else if (s.equals("-")){
                    Integer tmp = stack.pop();
                    stack.push(stack.pop() - tmp);
                }else if (s.equals("*")){
                    stack.push(stack.pop() * stack.pop());
                }else if(s.equals("/")){
                    Integer tmp = stack.pop();
                    stack.push(stack.pop() / tmp);
                }else{
                    stack.push(Integer.parseInt(s));
                }
        }
        
        return stack.peek();
    }