1. 程式人生 > >字首、中綴、字尾表示式相互轉換

字首、中綴、字尾表示式相互轉換

這裡只提供了使用棧的方法,還可以利用樹的遍歷實現。

中綴表示式轉換為字首表示式。 

首先建立算術符棧OPTR和表示式棧RESULT並置空,然後依次逆序檢查中綴表示式每個字元,不同字元按不同情況處理:

(1).若是空格直接跳過。

(2).若是運算元直接壓入RESULT棧。

(3).若是‘)’直接存入OPTR棧,等待和它匹配的‘(’出現。

(4).若是‘(’表明括號中的終追表示式已轉換完畢,則迴圈彈出OPTR棧的操作符,  並壓入RESULT棧,直到取出一個和它匹配的‘)’為止,‘)’出棧丟棄。

(5).若是運算子,如果OPTR棧是空的或者該運算子優先順序高於或等於OPTR棧的棧頂運算子則入棧,如果該運算子優先順序低,則迴圈彈出OPTR棧的運算子並存入RESULT,直到遇到棧頂的運算子優先順序等於或小於該演算法或棧空為止,然後將當前操作符存入OPTR棧。

若表示式掃描完後OPTR棧還有運算子,則依次彈出壓入RESULT棧,直至棧空。最後RESULT棧中的元素依次出棧存入字串中,並向字串中寫入‘�’,則字串中存放的就是字首表示式。

 字首表示式求值。 

首先建立一個棧並置空,然後從右到左掃描字首表示式,從右邊第一個字元開始判斷,如果當前字元是數字則一直到數字串的末尾再將整個數字串作為一個整體壓人棧,如果是運算子,則將棧頂和次棧頂的兩個“數字串”出棧並作相應的運算,然後將計算結果入棧。掃描完字首式後,棧中剩餘的最後一個值就是字首表示式的值。

中綴表示式轉換成字尾表示式。

首先建立棧並置空,然後依次檢查中綴表示式每個字元,不同字元按不同情況處理:

(1).若是運算元,就直接將存入字串exp[]中。

(2).若是‘(’則將其壓入棧中。

(3).若是‘)’則依次彈棧並存入字串exp[]中,直到遇到取出和它匹配的‘(’為止,‘(’出棧丟棄。

(4).若是操作符,如果棧空或者該操作符的優先順序大於棧頂操作符則將其放入到棧中。如果該操作符的優先順序小於等於棧頂操作符則彈出棧中的操作符存入字串exp[]中,直到該操作符的優先順序大於棧頂操作符或棧空,然後將該操作符入棧。

當讀到了中綴式的末尾時,如果棧非空則將棧中所有元素依次彈出存入字串exp[]中,最後見‘�’存入exp[]中,則exp[]中儲存的就是字尾表示式。

字尾表示式求值。 

首先建立一個棧並置空,然後依次左掃描字尾表示式,從第一個字元開始判斷,如果當前字元是數字則一直到數字串的末尾再將整個數字串作為一個整體壓人棧,如果是運算子,則將棧頂和次棧頂的兩個“數字串”出棧並作相應的運算,然後將計算結果入棧。掃描完字首式後,棧中剩餘的最後一個值就是字首表示式的值。


歡迎到微信裡去當吃瓜群眾