題目描述
給你一個字串陣列 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(); }
速度一下子上去了