根據逆波蘭表示法,求表達式的值。
有效的運算符包括 +
, -
, *
, /
。每個運算對象可以是整數,也可以是另一個逆波蘭表達式。
說明:
- 整數除法只保留整數部分。
- 給定逆波蘭表達式總是有效的。換句話說,表達式總會得出有效數值且不存在除數為 0 的情況。
示例 1:
輸入: ["2", "1", "+", "3", "*"]
輸出: 9
解釋: ((2 + 1) * 3) = 9
示例 2:
輸入: ["4", "13", "5", "/", "+"]
輸出: 6
解釋: (4 + (13 / 5)) = 6
示例 3:
輸入: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]
輸出: 22
解釋:
((10 * (6 / ((9 + 3) * -11))) + 17) + 5
= ((10 * (6 / (12 * -11))) + 17) + 5
= ((10 * (6 / -132)) + 17) + 5
= ((10 * 0) + 17) + 5
= (0 + 17) + 5
= 17 + 5
= 22
根據此題,掌握數據結構中棧的使用
題目分析:
逆波蘭式也叫后綴表達式。逆波蘭式的定義可以goole查詢。
那么怎樣根據給出的逆波蘭式轉換為我們熟悉的中綴表達式來求值呢?
這就需要運用到棧的知識:根據這個題目,我們掃描字符數組,當掃描到的字符是數字的時候,入棧;當掃描到的字符是運算符的時候,將棧中棧頂數字和與棧頂相連的數字出棧,進行相關運算后,將結果入棧;
最后棧頂元素就是表達式的結果,通過peek()操作就可以輸出。
看一下實現代碼:
1 public int evalRPN(String[] tokens) 2 { 3 Stack<Integer> stack = new Stack<>(); 4 5 if (tokens.length == 0) 6 return 0; 7 8 for (int i = 0; i < tokens.length; i++) 9 { 10 if (tokens[i].equals("+") || tokens[i].equals("-") || tokens[i].equals("*") || tokens[i].equals("/")) 11 { 12 if (tokens[i].equals("+")) 13 { 14 int num1 = stack.peek(); 15 stack.pop(); 16 int num2 = stack.peek(); 17 stack.pop(); 18 stack.push(num1 + num2); 19 } 20 21 if (tokens[i].equals("-")) 22 { 23 int num1 = stack.peek(); 24 stack.pop(); 25 int num2 = stack.peek(); 26 stack.pop(); 27 stack.push(num2 - num1); 28 } 29 30 if (tokens[i].equals("*")) 31 { 32 int num1 = stack.peek(); 33 stack.pop(); 34 int num2 = stack.peek(); 35 stack.pop(); 36 stack.push(num2 * num1); 37 } 38 39 if (tokens[i].equals("/")) 40 { 41 int num1 = stack.peek(); 42 stack.pop(); 43 int num2 = stack.peek(); 44 stack.pop(); 45 stack.push(num2 / num1); 46 } 47 48 } 49 50 else 51 stack.push(Integer.parseInt(tokens[i])); 52 } 53 54 return stack.peek(); 55 }
主函數:
1 public static void main(String[] args) 2 { 3 T6 t = new T6(); 4 5 int end1 = t.evalRPN(new String[]{"2", "1", "+", "3", "*"}); 6 System.out.println(end1); 7 8 int end2 = t.evalRPN(new String[]{"10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"}); 9 System.out.println(end2); 10 }
運行結果:
1 9 2 22