用棧實現表達式轉換(中綴轉後綴、中綴轉前綴)-----棧和隊列的應用2

中綴轉後綴

  1. 將輸入的字符串從左到右掃描;
  2. 若當前字符是操作數則直接打印;
  3. 若當前字符是運算符,先判斷棧是否爲空,若是,則直接將此操作符壓入棧;若不是,則查看棧頂運算符,若當前運算符優先級<=棧頂運算符優先級,就把棧頂運算符出棧並寫入當前得到的結果表達式。循環這個過程,直到當前運算符優先級>棧頂運算符優先級,則將掃描到的運算符入棧;
  4. 若當前字符是左括號則直接壓入棧;
  5. 若當前棧頂運算符是左括號則直接將當前運算符入棧;
  6. 若當前字符是右括號則打印並彈出棧中第一個左括號前的所有運算符,並且將左括號彈出但不寫入(右括號永遠不入棧)。
  7. 當掃描完原中綴表達式所有字符時若棧中還有剩餘運算符,則全部出棧並寫入結果表達式中(從棧頂開始出,因爲棧要後進先出)。
    在這裏插入圖片描述
    圖中白線代表棧的容量至少是5。

中綴轉後綴的手算方法:
① 確定中綴表達式中各個運算符的運算順序
② 選擇下一個運算符,按照「左操作數 右操作數 運算符」的方式組合成一個新的操作數
③ 如果還有運算符沒被處理,就繼續 ②
“左優先”原則:只要左邊的運算符能先計算,就優先算左邊的

中綴轉後綴的機算方法:
初始化一個棧,用於保存暫時還不能確定運算順序的運算符。
從左到右處理各個元素,直到末尾。可能遇到三種情況:
① 遇到操作數。直接加入後綴表達式。
② 遇到界限符。遇到“(”直接入棧;遇到“)”則依次彈出棧內運算符並加入後綴表達式,直到
彈出“(”爲止。注意:“(”不加入後綴表達式。
③ 遇到運算符。依次彈出棧中優先級高於或等於當前運算符的所有運算符,並加入後綴表達式,
若碰到“(” 或棧空則停止。之後再把當前運算符入棧。
按上述方法處理完所有字符後,將棧中剩餘運算符依次彈出,並加入後綴表達式。


中綴轉前綴

  1. 將輸入的字符串從右到左掃描;
  2. 若當前字符是操作數則直接打印;
  3. 若當前字符是運算符,先判斷棧是否爲空,若是,則直接將此操作符壓入棧;若不是,則查看棧頂運算符,若當前運算符優先級<棧頂運算符優先級,就把棧頂運算符出棧並寫入當前得到的結果表達式。然後當前運算符繼續循環這個過程,直到當前運算符優先級>=棧頂運算符優先級,則將掃描到的運算符入棧;
  4. 若當前字符是右括號則直接壓入棧;
  5. 若當前棧頂運算符是右括號則直接將當前運算符入棧;
  6. 若當前字符是左括號則打印並彈出棧中第一個右括號前的所有運算符,並且將右括號彈出但不寫入(左括號永遠不入棧);
  7. 當掃描完原中綴表達式所有字符時若棧中還有剩餘運算符,則全部出棧並寫入結果表達式中(從棧頂開始出,因爲棧要後進先出)。
    在這裏插入圖片描述

後綴轉前綴

在這裏插入圖片描述
每次掃描到一個運算符時就把這個運算符所對應的兩個子表達式移到運算符後邊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章