Leetcode——150. 逆波兰表达式求值

题目描述

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。

输入: ["2", "1", "+", "3", " * "]
输出: 9
解释: 该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9

逆波兰表达式说明

  • 去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。

  • 适合用栈操作运算:遇到数字则入栈;遇到运算符则取出栈顶两个数字进行计算,并将结果压入栈中。

参考实现

    public int evalRPN(String[] tokens) {
        Deque<Integer> deque = new LinkedList<>();
        for (String str : tokens) {
            if ("+".equals(str)) {
                deque.push(deque.pop() + deque.pop());
            } else if ("-".equals(str)) {
                deque.push(-deque.pop() + deque.pop());
            } else if ("*".equals(str)) {
                deque.push(deque.pop() * deque.pop());
            } else if ("/".equals(str)) {
                int a = deque.pop();
                int b = deque.pop();
                deque.push(b / a);
            } else {
                deque.push(Integer.valueOf(str));
            }
        }
        return deque.pop();
    }

优化版

    public int evalRPN1(String[] tokens) {
        Deque<Integer> deque = new LinkedList<>();
        for (String str : tokens) {
            switch (str) {
                case "+" -> deque.push(deque.pop() + deque.pop());
                case "-" -> deque.push(-deque.pop() + deque.pop());
                case "*" -> deque.push(deque.pop() * deque.pop());
                case "/" -> {
                    int a = deque.pop();
                    int b = deque.pop();
                    deque.push(b / a);
                }
                default -> deque.push(Integer.valueOf(str));
            }
        }
        return deque.pop();
    }

速度一下子上去了

 

posted @ 2024-07-16 06:48  晓枫的春天  阅读(2)  评论(0编辑  收藏  举报