中綴轉字尾需要處理的有:
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 ..}, 同時删除此運算符....
對中綴表達式的另一種計算方法:
利用一個棧計錄運算符,另一棧記錄操作數,邊掃描邊計算或壓棧....(資料結構-來蔚敏)