1. 程式人生 > >逆波蘭表達式求值

逆波蘭表達式求值

遍歷 public pub char 解題思路 item 有效 tac clas

問題描述:

根據逆波蘭表示法,求表達式的值。

有效的運算符包括 +, -, *, / 。每個運算對象可以是整數,也可以是另一個逆波蘭表達式。

說明:

  • 整數除法只保留整數部分。
  • 給定逆波蘭表達式總是有效的。換句話說,表達式總會得出有效數值且不存在除數為 0 的情況。

示例 1:

輸入: ["2", "1", "+", "3", "*"]
輸出: 9
解釋: ((2 + 1) * 3) = 9

示例 2:

輸入: ["4", "13", "5", "/", "+"]
輸出: 6
解釋: (4 + (13 / 5)) = 6

解題思路:

定義一個整數棧st,遍歷給定的字符串數組的每個元素;

若是數字轉為整數壓入棧st中;

若是運算符,從棧st取出兩個元素做運算,並將結果壓入棧st中。

則棧st的最後一個元素即是運算結果。

["2", "1", "+", "3", "*"]

"2", 入棧

"1",入棧

"+",取出2與1, 1+2=3, 3入棧

"3", 入棧

"*",取出3與3, 3*3=9, 9入棧

棧的最後一個元素即是結果。

實現代碼:

    public static int evalRPN(String[] tokens) {

        Stack<Integer> st = new Stack<>();

        
for (int i=0; i<tokens.length; i++) { switch(tokens[i]) { case "+": st.push(st.pop()+st.pop()); break; case "-": st.push(-st.pop()+st.pop()); break; case "*": st.push(st.pop()
*st.pop()); break; case "/": int num = st.pop(); st.push(st.pop()/num); break; default: st.push(Integer.valueOf(tokens[i])); break; } } return st.pop(); }

補充:java中switch case 支持String數據類型。(其它還包括byte,short,char,int四種整形類型與枚舉)

逆波蘭表達式求值