無論是面試還是考研,數據結構中都會出現一類題型,就是已知中綴表達式求其前綴表達式或者后綴表達式。這類題型多遇見幾個,多做幾個掌握以下方法,就沒問題了。
先說一個比較簡單的,個人還是比較傾向於這種的二叉樹表示法:
表達式A*B:左子樹為表達式A,右子樹為表達式B,可以先求左子樹所表示的表達式的值,再求右子樹所表示的表達式的值,最后二者相乘。注意,所畫出的二叉樹,它的葉子節點為數值,非葉子節點是運算符。畫出二叉樹以后,依次進行前序遍歷和后序遍歷,可以得出前綴表達式和后綴表達式。
例如美團曾經出過的一個筆試題目:

解答:
根據題目,我們可以畫出二叉樹,如圖所示:

然后根據后序遍歷,即可得出后綴表達式,前序遍歷即可得出前綴表達式~
另外一種辦法是利用棧進行操作,利用棧進行操作的這一種辦法和許多書上不太一樣,這是我在其他大牛的博客里學習的,那么在這里附上大牛寫的博客的網址:
順帶把大牛總結的內容自己小結一下:
將中綴表達式轉換為前綴表達式:
遵循以下步驟:
(1) 初始化兩個棧:運算符棧S1和儲存中間結果的棧S2;
(2) 從右至左掃描中綴表達式;
(3) 遇到操作數時,將其壓入S2;
(4) 遇到運算符時,比較其與S1棧頂運算符的優先級:
(4-1) 如果S1為空,或棧頂運算符為右括號“)”,則直接將此運算符入棧;
(4-2) 否則,若優先級比棧頂運算符的較高或相等,也將運算符壓入S1;
(4-3) 否則,將S1棧頂的運算符彈出並壓入到S2中,再次轉到(4-1)與S1中新的棧頂運算符相比較;
(5) 遇到括號時:
(5-1) 如果是右括號“)”,則直接壓入S1;
(5-2) 如果是左括號“(”,則依次彈出S1棧頂的運算符,並壓入S2,直到遇到右括號為止,此時將這一對括號丟棄;
(6) 重復步驟(2)至(5),直到表達式的最左邊;
(7) 將S1中剩余的運算符依次彈出並壓入S2;
(8) 依次彈出S2中的元素並輸出,結果即為中綴表達式對應的前綴表達式。
將中綴表達式轉換為后綴表達式:
與轉換為前綴表達式相似,遵循以下步驟:
(1) 初始化兩個棧:運算符棧S1和儲存中間結果的棧S2;
(2) 從左至右掃描中綴表達式;
(3) 遇到操作數時,將其壓入S2;
(4) 遇到運算符時,比較其與S1棧頂運算符的優先級:
(4-1) 如果S1為空,或棧頂運算符為左括號“(”,則直接將此運算符入棧;
(4-2) 否則,若優先級比棧頂運算符的高,也將運算符壓入S1(注意轉換為前綴表達式時是優先級較高或相同,而這里則不包括相同的情況);
(4-3) 否則,將S1棧頂的運算符彈出並壓入到S2中,再次轉到(4-1)與S1中新的棧頂運算符相比較;
(5) 遇到括號時:
(5-1) 如果是左括號“(”,則直接壓入S1;
(5-2) 如果是右括號“)”,則依次彈出S1棧頂的運算符,並壓入S2,直到遇到左括號為止,此時將這一對括號丟棄;
(6) 重復步驟(2)至(5),直到表達式的最右邊;
(7) 將S1中剩余的運算符依次彈出並壓入S2;
(8) 依次彈出S2中的元素並輸出,結果的逆序即為中綴表達式對應的后綴表達式(轉換為前綴表達式時不 用逆序)。
綜上所述,對於出現這種已知中綴表達式求前綴表達式和后綴表達式的話,優先采用二叉樹,選擇而已,不用花費太長的時間。
不足之處:后期有時間考慮加上代碼~
