1. 程式人生 > >棧的應用 中綴表示式 轉換為 字尾表示式 和 字首表示式

棧的應用 中綴表示式 轉換為 字尾表示式 和 字首表示式

表示式舉例

中綴表示式 A+(B-C/D)*E

字尾表示式 ABCD/-E*+

中綴表示式與字尾表示式的區別:

  • 運算數的順序都是相同的
  • 運算子的書寫順序不同,但真正的邏輯計算順序相同
    將中綴表示式

運算子的優先順序

  • 乘法(或除法)、取模運算 最高
  • 加法(減法) 次高
  • 左括號 最低

棧的應用

將中綴表示式轉換為字尾表示式的過程需要用到棧,因為當從左到右掃描時不能確定當前運算子的優先級別(沒有掃到最右邊,還不能預知)

在後綴表示式中,優先順序高的以及括號內的運算子出現在前面

中綴表示式轉字尾表示式的步驟

(1) 從左到右掃描,遇到數字,判斷是否大於0小於9,若是新增到字尾表示式,繼續取字元
(2) 遇到乘號(或除號),判斷若棧不為空且棧頂取出來的是乘號(或除號),則將棧頂的運算子出棧,若不滿足則不將棧頂的運算子出棧。然後當前運算子入棧。
(3) 遇到左括號,直接入棧。
(4) 遇到加號(或減號),判斷若棧不為空且棧頂取出來的不是左括號,則出棧運算子,若不滿足則不將棧頂的運算子出棧。然後當前運算子入棧。
(5) 遇到右括號,出棧。然後將左括號之前的全部追加到字尾表示式中。

計算字尾表示式的值

(1) 若遇到數字,入棧。
(2) 若遇到運算子,取出棧頂的2個元素

中綴表示式轉字首表示式的步驟

(1) 初始化2個棧:運算子棧S1和儲存中間結果的棧S2
(2) 從右到左掃描中綴表示式
(3) 遇到運算元,將其放入S2
(4) 遇到運算子,比較其與S1棧頂運算子的優先順序
(4-1)若S1為空,或棧頂運算子為右括號,則直接將此運算子入棧
(4-2)否則,若優先順序比棧頂運算子高或相等,也將次運算子入棧
(4-2)否則,將S1棧頂的運算子彈出並壓入S2中,然後跳轉到(4-1)與S1中新的棧頂運算子進行優先順序的比較
(5) 遇到括號時
(5-1)若是右括號,則直接入棧S1
(5-2)若是左括號,依次彈出S1的棧頂運算子並壓入S2中,直到遇到右括號為止,此時將這一對括號丟棄
(6) 重複步驟(2)—(5)直到表示式的最左邊
(7) 將S1中剩餘的運算子依次彈出並壓入S2
(8) 依次彈出S2中的元素並輸出,此即為中綴表示式對應的字首表示式

字首表示式的計算

與字尾表示式類似,從右到左掃描,若遇到運算子,則彈出2個元素進行運算

僅供學習