中綴 字尾表示式 四則運算

2022-09-22 04:54:07 字數 2398 閱讀 8291

中綴表示式轉化為字尾表示式,並通過字尾表示式計算值

轉化規則:

出棧(出棧後元素新增到字尾表示式的末尾)

中綴表示式掃瞄完畢後,若棧內元素不為空,依次出棧直到棧為空,出棧元素新增到字尾表示式後

舉例:3 * (2 + 5) - 4 / 2 過程如下

建立操作符棧,以及儲存字尾表示式的佇列:

從頭到尾掃瞄中綴表示式,首先掃瞄到 3,為運算元,新增到佇列尾,作為字尾表示式;

然後掃瞄到 * 操作符,此時棧頂為空,即 op 優先順序大於棧頂,入棧;

掃瞄到(,入棧;

掃瞄到 2,為運算元,新增到佇列尾;

掃瞄到 +,為操作符,棧頂元素為(,無優先順序關係,入棧;

掃瞄到 5,為運算元,新增到隊尾;

2~7 過程生成的圖如下:

掃瞄到),出棧一直到(也出棧為止,出棧元素(除(外)新增到佇列尾;完成後如下圖:

繼續掃瞄中綴表示式,掃瞄到-,優先順序低於棧頂(*);出棧一直到棧頂優先順序高於 - 或棧為空時,出棧停止,-入棧;注意所有出棧元素依次新增到佇列尾;如下圖:

掃瞄到 4,新增到隊尾;

掃瞄到/,優先順序大於棧頂(-),入棧;

掃瞄到 2,新增到隊尾;

10~12 過程生成圖如下:

至此,中綴表示式掃瞄完畢;將棧內元素依次出棧新增到隊尾;完成後棧為空,佇列如下:

佇列元素依次出隊輸出可得字尾表示式:3 2 5 + * 4 2 / -

字尾表示式生成後,將對字尾表示式進行計算;

計算規則:

以上面得出的字尾表示式 3 2 5 + * 4 2 / - 為例,計算過程如下:

掃瞄得到 3,為運算元,入棧;

掃瞄得到 2,為運算元,入棧;

掃瞄得到 5,為運算元,入棧;

1~3 過程結果如下:

掃瞄到 +,為操作符,依次出棧兩次,出棧順序為 5(top1) 2(top2);使用操作符運算:2 + 5

結果為 7 入棧;

掃瞄到 *,依次出棧兩次,出棧順序為 7(top1) 3(top2);使用操作符運算:3 * 7

結果為 21 入棧;

掃瞄到 4 為運算元,入棧;

掃瞄到 2 為運算元,入棧;

掃瞄到 /,依次出棧兩次,出棧順序為 2(top1) 4(top2);使用操作符運算:4 / 2

結果為 2 入棧;

掃瞄到 -,依次出棧兩次,出棧順序為 2(top1) 21(top2);使用操作符運算:21 - 2

結果為 19 入棧;

10. 掃瞄完畢,棧內元素即為最終結果 19;3 * (2 + 5) - 4 / 2 = 19;

讀取一串字串,將其轉換為字尾表示式,考慮如下幾點:

至此,乙個能夠處理整數的簡易計算器便實現了;

當然本例中採取的方式有點複雜,更簡單的做法可以直接通過分隔符分離;例如 32 + 3.14 按空格直接分離可以直接得到運算元和操作符 32, +, 3.14 這樣便很容易的分離出運算元,不管其為乙個多位數還是浮點數,然後剩餘的原理部分與本例相同;

乙個用 j**a 採用此類方式實現的簡易計算器:鏈結

四則運算的中綴表示式和字尾表示式

中綴表示式 就是運算符號在數字中間的表達方式。字尾表示式 運算符號在數字的後面出現。1 中綴表示式向字尾表示式的轉換方法 規則 從左到右遍歷中綴表示式的每個數字和符號,若是數字就輸出,即成為字尾表示式的一部分 若是符號,就判斷當前符號與棧頂符號的優先順序,如果是右括號或者是優先順序低於棧頂符號 乘除...

中綴表示式求解四則運算

功能實現 四則運算中包含 括號 加減 乘除 小數點 樣例輸入 12.5 8 3 2 3 5 樣例輸出 2 邏輯整理 建立兩個棧,分別用來儲存數字型別和操作符型別。依次讀入每個字元,直至所有字元均遍歷完畢 判斷當前字元s是數字還是操作符 數字 由於數字的位數以及小數點情況均不確定,因此需要從當前字元的...

棧的應用 四則運算(字尾表示式)

那麼字尾表示法如何寫出來的呢?先看乙個簡單的例子 乙個中綴四則表示式 9 3 1 x3 10 2 變成字尾表示式 9 3 1 3 x 10 2 那麼它是怎麼變的呢?先別急,我們先來看看計算機是如何計算字尾表示式的。規則 從左到右遍歷表示式的每個數字和符號,遇到數字就進棧,遇到符號就將棧頂的兩個數字出...