數據結構與算法學習筆記4--------中綴表達式轉後綴表達式

一.什麼是中綴表達式

前綴(波蘭式)、中綴、後綴(逆波蘭式)表達式三者都是運算表達式,只是形式有區別,即運算符相對與操作數的位置不同:前綴表達式的運算符位於與其相關的操作數之前;後綴表達式運算符位於與其相關的操作數之後。
中綴表達式是人常用的運算表達式,對於人腦來說容易理解,但是對計算機來說計算中綴表達式較爲困難,故需要把中綴表達式轉爲後綴表達式再進行運算。

public static List<String> parseSuffixExpressionList(List<String> ls){
		//定義兩個棧
		Stack<String> s1 = new Stack<String>();//符號棧
		//Stack<String> s2 = new Stack<String>(); s2這個棧在轉換過程中沒有pop操作 故直接用ArrayList
		
		List<String> s2 = new ArrayList<String>();
		
		for(String item:ls) {
			//如果是一個數 加入s2
			if(item.matches("\\d+")) {
				s2.add(item);			
			}else if(item.equals("(")) {
				s1.push(item);
			}else if(item.equals(")")){
				//右括號則執行“消除括號操作” 將s1棧頂符號彈出壓入s2 直到遇到左括號爲止 ----》丟棄括號
				while(!s1.peek().equals("(")) {
					s2.add(s1.pop());//s1彈出 加入 s2
				}
				s1.pop();//這樣就消掉了括號
			}else{
				//當item優先級小於等於s1棧頂運算符的優先級
				while(s1.size()>0 && operation.getVal(item)<= operation.getVal(s1.peek())  ) {
					s2.add(s1.pop());
				}
				//循環結束後,將item再壓入棧頂
				s1.push(item);
			}
		}
		//將s1剩餘的運算符加入s2中
		while(s1.size()!=0) {
			s2.add(s1.pop());
		}
		return s2;
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章