天天看點

中綴表達式轉字尾表達式 (中綴表達式的計算)

中綴轉字尾需要處理的有:

1. 操作數,操作符的提取

2. 括号等關系到運算符優先級的符号

3. 一進制操作符(如 +(正), -(負)) 等

4. 操作符和操作數的比對,括号的比對,(函數參數的個數是否正确等)

基本思路如下:

用一個連結清單 List 儲存将要生成的字尾表達式

用一個棧 Stack 儲存操作符

判斷目前節點, 如果是操作數, 直接加入字尾表達式中, 如果是操作符,則比較前一個操作符和目前操作符的優先級,

如果前一個操作符優先級較高,則将前一個操作符加入字尾表達式中,否則将操作符壓入操作符棧(從頂到棧底),如果遇到反括号 ')', 則在操作符棧中反向搜尋,直到遇到比對的正括号為止,将中間的操作符依次加到字尾表達式中。

舉例: 15+25*2, 共有 15, +, 25, *, 2 五個符号,下面一步步列出每一步操作

第六步:沒有符号了,直接将操作符棧中剩餘的依次加到表達式中,最終的結果

那假如括号呢例如 (15 + 25) * 2, 共有7個符号,每一步的操作為

第一步: 左括号直接壓入操作符棧

操作符棧 (
字尾表達式

第二步:數字加入表達式中

操作符棧 (
字尾表達式 15

第三步:+号壓入操作符棧

操作符棧 ( +
字尾表達式 15

第四步:數字加入表達式中

操作符棧 ( +
字尾表達式 15 25

第五步:遇到反括号了,将兩個括号之間操作符依次加入到表達式中,并删除比對的正括号

操作符棧
字尾表達式 15 25 +

第六步:*号壓入操作符棧

操作符棧 *
字尾表達式 15 25 +

第七步:數字加入表達式中

操作符棧 *
字尾表達式 15 25 + 2

第八步:沒有符号了,直接将操作符棧中剩餘的依次加到表達式中,最終的結果

操作符棧
字尾表達式 15 25 + 2 *

這樣就可以看出優先級對表達式的影響。

//以上轉自Internet..........

注:對于+,-作為一無運算符時,優先級較高(僅低于'('),可轉化為另一符号,以與 其二進制相差別.

對于字尾表達式的計算:

  如:15 25 + 2 *

  順序掃描運算符,若發現運算符 A,就對緊鄰其前的資料進行運算,并以新的結果替換原操作數(若A是一進制,則将其前操作數operand1=( A operand1 ), 若A是二進制的,則 operand1 = operand1 A operand2 , delete operand2 ..}, 同時删除此運算符....

對中綴表達式的另一種計算方法:

利用一個棧計錄運算符,另一棧記錄操作數,邊掃描邊計算或壓棧....(資料結構-來蔚敏)

繼續閱讀