題目:
Evaluate the value of an arithmetic expression in Reverse Polish Notation.
Valid operators are +
, -
, *
, /
. Each operand may be an integer or another expression.
Some examples:
["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9 ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6
題解:
這道題,其實上過課的應該都知道,忘記是哪門課講得了。。知道原理的話就比較容易寫出來。下面引用一下什麼是Reverse Polish Notation:
“標準的表示式如"A+B",在數學上學名 叫中綴表示式(Infix Notation),原因是運算子號在兩個運算物件的中間。相對應的還有字首表示式(Prefix Notation),如:"+ - A * B C D",轉換成中綴表示式為:"A - B * C + D";字尾表示式(Postfix Notation),比如前所述的中綴表示式轉換為字尾表示式為:"A B C * - D +"。為了紀念波蘭數學家魯卡謝維奇(Jan Lukasiewicz),字首表示式被稱作波蘭表示式,字尾表示式稱為逆波蘭表示式(Reverse Polish Notation)。
字尾表示式的優點是顯而易見的,編譯器在處理時候按照從左至右的順序讀取逆波蘭表示式,遇到運算物件直接壓入堆疊,遇到運算子就從堆疊提取後進的兩個物件進行計算,這個過程正好符合了計算機計算的原理。
字尾表示式比字首表示式更加易於轉換,並且它的最左面一定為數字,這一點在實際程式設計的時候就會體會到它的好處了。
逆波蘭表示式有一個更大的優點,就是拆括號,根據運算子的級別將中綴表示式轉換成逆波蘭表示式後,運算順序就已經替代了運算子的級別,這樣也避免了括號提高運算級別的特殊處理。
事 實上,人的思維方式很容易固定~~!正如習慣拉10進位制
1 public static int evalRPN(String[] tokens) {
2 if(tokens==null||tokens.length==0)
3 return 0;
4 int ans = 0;
5 Stack<Integer> res = new Stack<Integer>();
6 for(int i = 0; i<tokens.length;i++){
7 ans = 0;
8 if(tokens[i].equals("/")||tokens[i].equals("*")||tokens[i].equals("+")||tokens[i].equals("-")){
9 int b = res.pop();
10 int a = res.pop();
11 if(tokens[i].equals("/"))
12 ans += a/b;
13 else if(tokens[i].equals("+"))
14 ans += a+b;
15 else if(tokens[i].equals("-"))
16 ans += a-b;
17 else if(tokens[i].equals("*"))
18 ans += a*b;
19 res.push(ans);
20 }else{
21 res.push(Integer.parseInt(tokens[i]));
22 }
23 }
24 return res.pop();
25 }
2 if(tokens==null||tokens.length==0)
3 return 0;
4 int ans = 0;
5 Stack<Integer> res = new Stack<Integer>();
6 for(int i = 0; i<tokens.length;i++){
7 ans = 0;
8 if(tokens[i].equals("/")||tokens[i].equals("*")||tokens[i].equals("+")||tokens[i].equals("-")){
9 int b = res.pop();
10 int a = res.pop();
11 if(tokens[i].equals("/"))
12 ans += a/b;
13 else if(tokens[i].equals("+"))
14 ans += a+b;
15 else if(tokens[i].equals("-"))
16 ans += a-b;
17 else if(tokens[i].equals("*"))
18 ans += a*b;
19 res.push(ans);
20 }else{
21 res.push(Integer.parseInt(tokens[i]));
22 }
23 }
24 return res.pop();
25 }
。就對2,3,4,8,16等進位制不知所措一樣~~!人們習慣的運算方式是中綴表示式。而碰到前 綴,字尾方式。。迷茫其實僅僅是一種表示式子的方式而已(不被你習慣的方式)我這裡教你一種也許你老師都沒跟你講的簡單轉換方式一箇中綴式到其他式子的轉 換方法~~這裡我給出一箇中綴表示式~a+b*c-(d+e)
第一步:按照運算子的優先順序對所有的運算單位加括號~
((a+(b*c))-(d+e)) 式子變成拉:<wbr><wbr><wbr><wbr><wbr><wbr>
第二步:轉換中綴與字尾表示式
字尾:把運算子號移動到對應的括號後面 <wbr><wbr><wbr><wbr><wbr><wbr>
則變成拉:((a(bc)*)+(de)+)- <wbr><wbr><wbr><wbr><wbr><wbr>
把括號去掉:abc*+de+- 字尾式子出現<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>
發現沒有,字首式,字尾式是不需要用括號來進行優先順序的確定的。
現在,你需要用計算機來實現這一過程,怎麼樣,是否有興趣一試呢?如果答案是肯定的話,Let‘s go!”
以上內容引用自:http://puppypuppy2005.blog.163.com/blog/static/5204815620107523258709/
程式碼如下: