棧在表示式計算中的應用

2021-06-25 19:48:31 字數 704 閱讀 1317

逆波蘭式(reverse polish notation,rpn,或逆波蘭記法),也叫字尾表示式(將運算子寫在運算元之後)

將乙個普通的中序表示式轉換為逆波蘭表示式的一般演算法是:

首先需要分配2個棧,乙個作為臨時儲存運算子的棧s1(含乙個結束符號),乙個作為輸入逆波蘭式的棧s2(空棧),s1棧可先放入優先順序最低的運算子#,注意,中綴式應以此最低優先順序的運算子結束。可指定其他字元,不一定非#不可。從中綴式的左端開始取字元,逐序進行如下步驟:

(1)若取出的字元是運算元,則分析出完整的運算數,該運算元直接送入s2棧

(2)若取出的字元是運算子,則將該運算子與s1棧棧頂元素比較,如果該運算子優先順序大於s1棧棧頂運算子優先順序,則將該運算子進s1棧,否則,將s1棧的棧頂運算子彈出,送入s2棧中,直至s1棧棧頂運算子低於(不包括等於)該運算子優先順序,則將該運算子送入s1棧。

(3)若取出的字元是「(」,則直接送入s1棧棧頂。

(4)若取出的字元是「)」,則將距離s1棧棧頂最近的「(」之間的運算子,逐個出棧,依次送入s2棧,此時拋棄「(」。

(5)重複上面的1~4步,直至處理完所有的輸入字元

(6)若取出的字元是「#」,則將s1棧內所有運算子(不包括「#」),逐個出棧,依次送入s2棧。

完成以上步驟,s2棧便為逆波蘭式輸出結果。

中綴表示式:a+b*(c-d)-e/f

轉換後的字尾表示式:abcd-*+ef/-        (結束)

棧在表示式求值中的應用

中綴表示式轉字尾表示式 初始化乙個棧,用來儲存暫還不能確定運算順序的運算子 從左到右處理各個元素,直到末尾。可能遇到三種情況 遇到運算子 依次彈出棧中優先順序高於或等於當前運算子的所有運算子,並加入字尾表示式,若碰到 或棧空則停止。之後再把當前運算子入棧 按上述方法處理完所有字元後,將棧中剩餘運算子...

棧在表示式求值中的應用

一 中綴表示式轉字尾表示式 從左到右處理各個元素 1.遇到運算元。直接加入字尾表示式 2.遇到界限符。遇到 直接入棧,遇到 則依次彈出棧內運算子並加入字尾表示式,直到彈出 為止。注意 不加入字尾表示式。3.遇到運算子。依次彈出棧中優先順序高於或等於當前運算子的所有運算子,並加入字尾表示式,若碰到 或...

棧在表示式計算過程中的應用

棧在表示式計算過程中的應用 建立運算元棧和運算子棧。運算子有優先順序。規則 自左至右掃瞄表示式,凡是遇到運算元一律進運算元棧。當遇到運算子時,如果它的優先順序比運算子棧棧頂元素的優先順序高就進棧。反之,取出棧頂運算子和運算元棧棧頂的連續兩個運算元進行運算,並將結果存入運算元棧,然後繼續比較該運算子與...