Leetcode——150. 逆波蘭表示式求值

晓枫的春天發表於2024-07-16

題目描述

給你一個字串陣列 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();
    }

速度一下子上去了

相關文章