中綴式轉化為字尾式的步驟 (簡單計算器 的實現)

2021-06-22 02:40:00 字數 1384 閱讀 7840

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

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...