前綴、中綴、后綴表達式


**我們平常使用的表達式一般為中綴表達式,而且一般只有中綴表達式有括號** #表達式樹 將中綴表達式轉化為表達式樹方法:表達式樹的樹葉是操作數,而其他的節點為操作符,**根節點為優先級最低且靠右的操作符**,圓括號不包括。

如中綴表達式\(1 + (( 2 + 3)* 4 ) – 5\)轉換后的表達式樹如下:

已知中綴表達式求前綴表達式和后綴表達式

每次找優先級最低的最右邊的運算符作為根,兩邊遞歸,直接建樹,前綴表達式和后綴表達式分別為前序遍歷和后序遍歷

已知后綴表達式求中綴表達式

每讀入一個字符壓進棧中,若讀入的是操作符則先將棧頂元素作為當前操作符的右子樹,出棧,再將棧頂元素作為當前操作符的左子樹,出棧,然后把這顆新的樹的父親節點入棧。

如后綴表達式$1 2 3 + 4 * +5 – $的轉換

輔助棧

中綴表達式轉后綴表達式

從左到右遍歷中綴表達式的每個操作數和操作符。當讀到操作數時,立即把它輸出,即成為后綴表達式的一部分。

若讀到操作符,判斷該符號與棧頂符號的優先級,若該符號優先級高於棧頂元素,則將該操作符入棧,否則就一次把棧中運算符彈出並加到后綴表達式尾端,直到遇到優先級低於該操作符的棧元素,然后把該操作符壓入棧中。(也就是維護了一個越靠近棧頂優先級越高的單調棧)如果遇到\(”(”\),直接壓入棧中,如果遇到一個\(”)”\),那么就將棧元素彈出並加到后綴表達式尾端(彈一個加一個),但左右括號並不輸出。

最后,如果讀到中綴表達式的尾端,將棧元素依次完全彈出並加到后綴表達式尾端。(別忘了)

例子:\(1 + (( 2 + 3)* 4 ) – 5\)





中綴表達式轉前綴表達式

和上面過程相同,維護一個優先級向棧頂遞增的單調棧,唯一不同的兩點是
\(1.\)從右向左掃描中綴表達式
\(2.\)遇到")"加入棧中,遇到"("彈出

部分內容參考這篇博客傳送門


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM