逆波蘭表示法

逆波蘭表示法
逆波蘭記法中,操作符置於操作數的後面。例如表達“三加四”時,寫作“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 /”;數字的數位寫法也是常規順序。

代碼實現:
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());

	}

}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章