話不多說上例子:1+((2+3)*4)-5 => 1 2 3 + 4 * + 5 -
中綴表示式轉字尾表示式思路分析:
1.首先需要兩個棧運算子棧 s1和儲存中間結果的棧 s2
2.從左至右掃瞄中綴表示式
2.1當前為運算元,將其壓棧至s2
2.2當前為運算子
2.2.1如果s1為空或者棧頂運算子為左括號「(」則將此運算子直接入s1棧
2.2.2當前為運算子「(」左括號時,則直接壓入s1
2.2.3當前為運算子「)」右括號時,則依次彈出s1棧頂的運算子,壓入s2,直至遇到「(」左括號時為止 這時將這一對括號丟棄。
2.2.4當前運算子優先順序比棧頂運算子優先順序高,將運算子壓入s1,否則將s1棧頂運算子彈出再壓入s2中,後重複運算子邏輯 (2.2)
先放將中綴表示式字串轉換成list程式:
// 將字串轉換成list
public static listgetliststring(string suffixexpression)
return list;
}
接下來需要乙個返回運算子優先順序的方法:
class operation
return res;
}}
最後是轉換方法,值得注意的是因為s2棧本來是儲存過程值最後需要將棧內容倒序輸出才是字尾表示式所以在方法中,就不再定義s2棧,直接用list做返回值:
// 中綴表示式轉字尾表示式
public static listparsesuffixexpressionlist(listlist) else else if (")".equals(item))
// 把 棧中剩餘的 ( 出棧
s.pop();
} else
s.push(item);}}
system.out.print("s1棧:"+l);
system.out.println("s2棧:"+s+" ");
} while(s.size()!=0)
return l;
}
最後程式執行的結果:
資料結構之中綴表示式轉字尾表示式
中綴表示式轉字尾表示式的基本規則 1.遇到運算元就直接輸出 2.遇到左括號就壓入棧中 3.遇到右括號就將棧中所有符號輸出且彈出 左括號只需要彈出不需要輸出 4.遇到操作符就與棧頂元素進行對比 當前操作符比棧頂操作符的優先順序大的話 就直接將當前操作符壓入棧中 當前操作符比棧頂操作符的優先順序小或者相...
資料結構之中綴表示式轉字尾表示式
對於計算機來說,字尾表示式更方便計算,但是對於我們來說,中綴表示式更方便理解。為了大家都方便,下面就聊聊如何把乙個中綴表示式借助 轉化成乙個字尾表示式。在實現轉字尾表示式時,用棧結構儲存操作符,由於中間結構不用出棧,並且如果用棧結構儲存,那麼將出棧結果逆序才是我們要的字尾表示式,所以用list儲存即...
資料結構之中綴表示式轉字尾表示式
初始化兩個棧 運算子棧s1和儲存中間結果的棧s2 從左至右掃瞄中綴表示式 遇到運算元時,將其壓s2 遇到運算子時,比較其與s1棧頂運算子的優先順序 1.如果s1為空,或棧頂運算子為左括號 則直接將此運算子入棧 2.否則,若優先順序比棧頂運算子的高,也將運算子壓入s1 3.否則,將s1棧頂的運算子彈出...