1. 程式人生 > >【資料結構演算法】如何使用棧計算字尾表示式

【資料結構演算法】如何使用棧計算字尾表示式

無聊寫的一個使用棧計算字尾表示式的程式碼:

初次寫,只有+-*/四個運算子,後面可以自己加,都差不多就是個算術運算子優先順序的問題。

主函式:包括初始化*+-/符號,判斷輸入的字元是運算元還是運算子。

/**
 * !!!!!(棧相關測試)
 * @author WZ
 *
 */
package MyCollection;

public class Test01 {
	/**
	 * 使用棧計算字尾表示式
	 * 
	 * @author WZ
	 *
	 */
	class CalPostfixExpressionByStack {

		private static final char ADD = '+';
		private static final char SUB = '-';
		private static final char MUL = '*';
		private static final char DEV = '/';

		MyStack stack1;

		public CalPostfixExpressionByStack() {
			stack1 = new MyStack();
		}

		public Object Scan(String expr) {
			int op1 = 0;
			int op2 = 0, result = 0;
			String token;
			Scanner scanner = new Scanner(expr);
			// System.out.println(scanner.next().charAt(1));
			while (scanner.hasNext()) {
				token = scanner.next();// next()不回錄入空格
				if (isOperator(token)) {
//					if (stack1.peek() instanceof Integer) {這裡是錯誤的,因為棧中的其他元素依然是String物件,String物件無法強轉成為Integer。
//						op1=(Integer) stack1.pop();
//						op2=(Integer) stack1.pop();
//					}
						op1 = (int) stack1.pop();
						op2 = (int) stack1.pop();				
					result = CalSingleOperator(token.charAt(0), op1, op2);
					stack1.push(result);
				} else {
					if (token instanceof String) {
						stack1.push(Integer.parseInt(token));//只要讀入的的是String物件,直接轉成Integer物件,避免後面的運算混亂
						
					}
				}
			}
			return result;

		}

		public int CalSingleOperator(char operator, int op1, int op2) {
			int result = 0;
//			Integer opp1=Integer.valueOf((String) op1);
//			Integer opp2=Integer.valueOf((String) op2);
//			Number number1 = (Number) op1;
//			Number number2 = (Number) op2;
//			int opp1 = number1.intValue();
//			int opp2 = number2.intValue();
			switch (operator) {
			case ADD:
				result = op2 + op1;
				break;
			case SUB:
				result = op2 - op1;
				break;
			case MUL:
				result = op2 * op1;
				break;
			case DEV:
				result = op2 / op1;
				break;

			default:
				break;
			}
			return result;
		}

		public boolean isOperator(String token) {
			return (token.equals("+") || token.equals("-") || token.equals("*") || token.equals("/"));
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// MyStack m=new MyStack();
		// char c='*';
		// m.push(c);
		// System.out.println(m.pop());
		/////////////////////////////////
		// String[] s1={"111","2222","333"};
		Test01 t1 = new Test01();
		// QueueWithTowStack queueWithTowStack=t1.new QueueWithTowStack();
		// for (int i = 0; i < s1.length; i++) {
		// queueWithTowStack.enQueue(s1[i]);
		// }
		//////////////////////////////////
		// queueWithTowStack.isEmpty();
		// System.out.println(queueWithTowStack.deQueue());
		// System.out.println(queueWithTowStack.deQueue());
		// System.out.println(queueWithTowStack.deQueue());
		///////////////////////////////////
		String exression;
		Object result;
		Scanner scanner = new Scanner(System.in);

		CalPostfixExpressionByStack c = t1.new CalPostfixExpressionByStack();
		System.out.println("請輸入一個字尾表示式:");
		System.out.println("例如123*+5-");
		exression = scanner.nextLine();
		result = c.Scan(exression);
		System.out.println("結果為:" + result);
	}

}

自己定義的Stack,有基本的功能就夠了......本人懶水平也不是很高。。。。

package MyCollection;

public class MyStack {
	private Object[] objects;
	private int top;
	
	public MyStack() {
		this(10);
	}
	
	public MyStack(int maxsize) {
		objects=new Object[maxsize];
		top=0;
	}
	
	public void push(Object obj) {
		objects[top++]=obj;
	}
	
	public Object pop() {
		return objects[--top];
	}
	
	public boolean isEmpty() {
		return top==0; 
	}
	
	public void disPlay() {
		for (int i = top-1; i >=0; i--) {
			System.out.println(objects[i]);
		}
	}
	
	public Object peek() {
		return objects[top-1];
	}
	
	public int size(){
		return top;
	} 
	public Object[] getObjects() {
		return objects;
	}
	public void setObjects(Object[] objects) {
		this.objects = objects;
	}
}

最後是一個輸出(哈哈哈哈火火吼吼...) 

請輸入一個字尾表示式:
例如123*+5-
1 2 3 * + 5 -
結果為:2

就這麼多了。。