如中綴表達式\(1 + (( 2 + 3)* 4 ) – 5\)轉換后的表達式樹如下:
已知中綴表達式求前綴表達式和后綴表達式
每次找優先級最低的最右邊的運算符作為根,兩邊遞歸,直接建樹,前綴表達式和后綴表達式分別為前序遍歷和后序遍歷
已知后綴表達式求中綴表達式
每讀入一個字符壓進棧中,若讀入的是操作符則先將棧頂元素作為當前操作符的右子樹,出棧,再將棧頂元素作為當前操作符的左子樹,出棧,然后把這顆新的樹的父親節點入棧。
如后綴表達式$1 2 3 + 4 * +5 – $的轉換
輔助棧
中綴表達式轉后綴表達式
從左到右遍歷中綴表達式的每個操作數和操作符。當讀到操作數時,立即把它輸出,即成為后綴表達式的一部分。
若讀到操作符,判斷該符號與棧頂符號的優先級,若該符號優先級高於棧頂元素,則將該操作符入棧,否則就一次把棧中運算符彈出並加到后綴表達式尾端,直到遇到優先級低於該操作符的棧元素,然后把該操作符壓入棧中。(也就是維護了一個越靠近棧頂優先級越高的單調棧)如果遇到\(”(”\),直接壓入棧中,如果遇到一個\(”)”\),那么就將棧元素彈出並加到后綴表達式尾端(彈一個加一個),但左右括號並不輸出。
最后,如果讀到中綴表達式的尾端,將棧元素依次完全彈出並加到后綴表達式尾端。(別忘了)
例子:\(1 + (( 2 + 3)* 4 ) – 5\)
中綴表達式轉前綴表達式
和上面過程相同,維護一個優先級向棧頂遞增的單調棧,唯一不同的兩點是
\(1.\)從右向左掃描中綴表達式
\(2.\)遇到")"加入棧中,遇到"("彈出
部分內容參考這篇博客傳送門