中綴轉字尾需要處理的有:
1. 運算元,操作符的提取
2. 括號等關係到運算子優先順序的符號
3. 一元操作符(如 +(正), -(負)) 等
4. 操作符和運算元的匹配,括號的匹配,(函式引數的個數是否正確等)
基本思路如下:
用乙個鍊錶 list儲存將要生成的字尾表示式
用乙個棧 stack儲存操作符
判斷當前節點, 如果是運算元, 直接加入字尾表示式中, 如果是操作符,則比較前乙個操作符和當前操作符的優先順序,
如果前乙個操作符優先順序較高,則將前乙個操作符加入字尾表示式中,否則將操作符壓入操作符棧,如果遇到反括號 ')', 則在操作符棧中反向搜尋,直到遇到匹配的正括號為止,將中間的操作符依次加到字尾表示式中。
舉例: 15+25*2, 共有 15, +, 25, *, 2 五個符號,下面一步步列出每一步操作
第一步: 數字加入字尾表示式
操作符棧 空
字尾表示式 15
第二步:+ 號 壓入操作符棧
操作符棧 +
字尾表示式 15
第三步:
操作符棧 +
字尾表示式 15 25
第四步:是乙個*號,因為*號的優先順序比+號高,所以直接壓入操作符棧中
操作符棧 + *
字尾表示式 15 25
第五步:
操作符棧 + *
字尾表示式 15 25 2
第六步:沒有符號了,直接將操作符棧中剩餘的依次加到表示式中,最終的結果
操作符棧 空
字尾表示式 15 25 2 * +
那假如括號呢?例如 (15 + 25) * 2, 共有7個符號,每一步的操作為
第一步: 左括號直接壓入操作符棧
操作符棧 (
字尾表示式 空
第二步:數字加入表示式中
操作符棧 (
字尾表示式 15
第三步:+號壓入操作符棧
操作符棧 ( +
字尾表示式 15
第四步:數字加入表示式中 操作符棧 ( +
字尾表示式 15 25
第五步:遇到反括號了,將兩個括號之間操作符依次加入到表示式中,並刪除匹配的正括號
操作符棧 空
字尾表示式 15 25 +
第六步:*號壓入操作符棧
操作符棧 *
字尾表示式 15 25 +
第七步:數字加入表示式中
操作符棧 *
字尾表示式 15 25 + 2
第八步:沒有符號了,直接將操作符棧中剩餘的依次加到表示式中,最終的結果 操作符棧 空
字尾表示式 15 25 + 2 *
這樣就可以看出優先順序對表示式的影響。
求字尾式 逆波蘭式 的步驟
原表示式 a b c d e f 為表示式結束符號 字尾式 abcde f x 為運算子定義優先順序 1 0 1 1 2 2 3 從原表示式求字尾式的規則為 1.設定運算子棧 2.假設表示式的結束符為 我們需要預設運算子棧底元素為 3.掃瞄表示式,若當前字元是運算元,則直接傳送給字尾表示式 4.若當...
棧的應用(括號匹配 字尾表式計算 中綴轉字尾)
ifndef stack h struct node typedef struct node ptrtonode typedef ptrtonode stack typedef float elementtype int isempty stack s stack createstack void ...
中綴表示式轉化為字首 字尾表示式的遞迴演算法
中綴表示式可以被劃分為part1 oper part2 將這三部分按part1 part2 oper的順序組成新的序列即為字尾表示式 同理也可得字首表示式 下為part1的分類 測試資料 1 2 3 4 5 輸出結果 1234 5 include include using namespace st...