字首、中綴、字尾表示式是對表示式的不同記法,其區別在於運算子相對於運算元的位置不同,字首表示式的運算子位於運算元之前.
中綴和字尾同理
雖然人的大腦很容易理解與分析中綴表示式,但對計算機來說中綴表示式卻是很複雜的,因此計算表示式的值時,通常需要先將中綴表示式轉換為字首或字尾表示式,然後再進行求值。對計算機來說,計算字首或字尾表示式的值非常簡單。
舉例:中綴表示式:1 + (2 + 3) × 4 - 5
字首表示式:- + 1 × + 2 3 4 5
字尾表示式:1 2 3 + 4 × + 5 -
將操作符號寫在運算元之前,也就是字首表示式
中綴轉字首轉換過程同樣需要用到棧,具體過程如下:
將中綴表示式轉換為字首表示式:
(1) 初始化兩個棧:運算子棧s1和儲存中間結果的棧s2;
(2) 從右至左掃瞄中綴表示式;
(3) 遇到運算元時,將其壓入s2;
(4) 遇到運算子時,比較其與s1棧頂運算子的優先順序:
從右至左掃瞄表示式
遇到數字時,將數字壓入堆疊,遇到運算子時,彈出棧頂的兩個數,用運算子對它們做相應的計算(棧頂元素 op 次頂元素),並將結果入棧
重複上述過程直到表示式最左端,最後運算得出的值即為表示式的結果
計算字首表示式的值:- + 1 × + 2 3 4 5
從右至左掃瞄,將5,4,3,2壓入堆疊;
遇到+運算子,彈出2和3(2為棧頂元素,3為次頂元素),計算2+3的值,得到5,將5壓入棧;
遇到×運算子,彈出5和4,計算5×4的值,得到20,將20壓入棧;
遇到1,將1壓入棧;
遇到+運算子,彈出1和20,計算1+20的值,得到21,將21壓入棧;
遇到-運算子,彈出21和5,計算21-5的值,得到16為最終結果
1)我們使用乙個stack棧結構儲存操作符,用乙個list結構儲存字尾表示式結果
2)首先讀取到數字,直接存入list中
3)當讀取到左括號"("時,直接壓棧,當讀取到運算子時,分兩種情況討論
a.當運算子棧為空或者棧頂操作符的優先順序小於當前運算子優先順序時(如+和-的優先順序低於 * 和 /),直接入棧
b.當運算子不為空時且棧頂操作符的優先順序大於或等於當前運算子優先順序時,迴圈執行出棧操作並加入list中,直到遇到優先順序小於當前運算子的元素為止。迴圈執行完後再將當前運算子壓棧。另外需要注意的是,只有遇到右括號時,左括號才出棧
4) 當遇到右括號")"時,迴圈執行出棧操作並加入到list中,直到遇到左括號為止。並將左括號彈出,但不加入list中
5) 表示式的值讀取完後,將操作符棧中的所有元素彈出並加入到list中
執行完上面步驟後,list中儲存的順序即為我們轉換後的字尾表示式的結果
運算子在運算元的後面3 * 4
===>3 4 *
, 所以也被稱為字尾表示式。
使用逆波蘭表示式時,是不需要使用括號的。在中綴表示式中,例如:(3 - 4) * 5
,我們需要使用括號提高減號的優先順序,而在逆波蘭表示式中是不需要使用括號的,3 4 - 5 *
,直接在3 4
運算元後面跟著乙個-
號, 就可以表示3 - 4
是首先計算的。
再舉幾個例子:
面對乙個複雜逆波蘭表示式,我們改如何計算呢?
例如:10 6 9 3 + -11 * / * 17 + 5 +
我們首先從頭開始遍歷逆波蘭表示式字串
遇到第乙個+
號9 + 3 = 12
,現在的表示式是,10 6 12 -11 * / * 17 + 5 +
遇到第二個*
號12 * -11 = -132
,現在的表示式是10 6 -132 / * 17 + 5 +
遇到第三個/
號6 / -132 = -0.04
,現在的表示式10 -0.04 * 17 + 5 +
遇到第四個*
號10 * -0.04 = -0.4
,現在的表示式-0.4 17 + 5 +
遇到第五個+
號-0.4 + 17 = 16.6
,現在的表示式16.6 5 +
遇到第六個+
號16.6 + 5 = 21.6
字尾式 逆波蘭式
逆波蘭式 是波蘭邏輯學家盧卡西維奇 lukasiewicz 發明的一種表示 表示式的方法。這種表示方式把運算子寫在運算物件的後面,例如,把a b寫成ab 所以也稱為字尾式。這種表示法的優點是根據運算物件和算符的出現次序進行計算,不需要使用括號,也便於用械實現求值。對於 表示式x a b c d 其字...
逆波蘭式轉換
逆波蘭式轉換 1 輸入 算術表示式 字串形式資料 2 輸出 逆波蘭式以及計算結果 轉換過程如下所示 棧底放 從左至右逐字讀取中綴式 a.當當前字元為數字時,直接輸出 b.當當前字元為 時,將其壓棧 c.當當前字元為 時,則彈出堆疊中最上的 之前的所有運算子並輸出,然後刪除堆疊中的 d.當當前字元為運...
逆波蘭式求值
先擺上資源 逆波蘭式求值 第一步 生成中綴表示式 第二步 中綴表示式轉換為字尾表示式 第三步 字尾表示式求值 本次實驗採用自主設計鏈式堆疊結構儲存資料 linkedstack儲存中綴及字尾表示式 pragma once include using namespace std typedef stru...