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