package test;
import java.util.Stack;
public class evalRPN {
public static void main(String[] args) {
// String[] tokens = {"2", "1", "+", "3", "*"};
String[] tokens = { "4", "13", "5", "/", "+" };
// evalRPN.evalRPN(tokens);
System.out.println(evalRPN.evalRPN(tokens));
}
public static int evalRPN(String[] tokens) {
Stack<String> stack = new Stack<String>();
for (String s : tokens) {
switch (s) {
case "+": {
int a = Integer.valueOf(stack.pop());
int b = Integer.valueOf(stack.pop());
String c = String.valueOf(a + b);
stack.push(c);
break;
}
case "-": {
int a = Integer.valueOf(stack.pop());
int b = Integer.valueOf(stack.pop());
String c = String.valueOf(b - a);
stack.push(c);
break;
}
case "*": {
int a = Integer.valueOf(stack.pop());
int b = Integer.valueOf(stack.pop());
String c = String.valueOf(a * b);
stack.push(c);
break;
}
case "/": {
int a = Integer.valueOf(stack.pop());
int b = Integer.valueOf(stack.pop());
String c = String.valueOf(b / a);
stack.push(c);
break;
}
default:
stack.push(s);
}
}
return Integer.valueOf(stack.pop());
}
}
逆波蘭表示法
逆波蘭表示法
逆波蘭記法中,操作符置於操作數的後面。例如表達“三加四”時,寫作“3 4 +”,而不是“3 + 4”。如果有多個操作符,操作符置於第二個操作數的後面,所以常規中綴記法的“3 - 4 + 5”在逆波蘭記法中寫作“3 4 - 5 +”:先3減去4,再加上5。使用逆波蘭記法的一個好處是不需要使用括號。例如中綴記法中“3 - 4 * 5”與“(3 - 4)*5”不相同,但後綴記法中前者寫做“3 4
5 * -”,無歧義地表示“3 (4 5 *) −”;後者寫做“3 4 - 5 *”。
逆波蘭表達式的解釋器一般是基於堆棧的。解釋過程一般是:操作數入棧;遇到操作符時,操作數出棧,求值,將結果入棧;當一遍後,棧頂就是表達式的值。因此逆波蘭表達式的求值使用堆棧結構很容易實現,和能很快求值。
注意:逆波蘭記法並不是簡單的波蘭表達式的反轉。因爲對於不滿足交換律的操作符,它的操作數寫法仍然是常規順序,如,波蘭記法“/ 6 3”的逆波蘭記法是“6 3 /”而不是“3 6 /”;數字的數位寫法也是常規順序。
代碼實現:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.