中綴表示式轉化為字尾表示式,並通過字尾表示式計算值轉化規則:
出棧(出棧後元素新增到字尾表示式的末尾)
中綴表示式掃瞄完畢後,若棧內元素不為空,依次出棧直到棧為空,出棧元素新增到字尾表示式後
舉例: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 那麼它是怎麼變的呢?先別急,我們先來看看計算機是如何計算字尾表示式的。規則 從左到右遍歷表示式的每個數字和符號,遇到數字就進棧,遇到符號就將棧頂的兩個數字出...