XCacl是一個基於Qt Creator開發的簡單的四則運算計算器。程序本身來說非常簡單,並無什么亮點,不過在寫這個程序時用到的一些算法還是值得我記錄的。
Developer:Jaywhen
📝: 程序代碼:點個
star
再走吧🤩!
核心算法:
-
后綴表達式 (逆波蘭式):
后綴表達式非常適合計算機來計算多項式,因為在后綴表達式中不存在括號以及優先級,計算后綴表達式只需使用棧即可
表示示例:
中綴:2+(4+6)x8-10 后綴:246+8x+10-
中綴表達式轉后綴表達式的方法:
- 聲明兩個空棧(輸出棧、運算符棧)
- 從左向右掃描中綴表達式,遇見數字將其壓入輸出棧
- 遇見操作符則將其與棧頂的操作符的優先級進行比較
如果該運算符的優先級比棧頂運算符的優先級高,則直接將其壓入運算符棧中 如果該運算符的優先級低於或等於棧頂運算符的優先級,則從棧頂開始彈出運算符至輸出棧,直至 遇見優先級比該運算符低的運算符時,將該運算符壓入棧頂 特殊:如果該運算符為左括號`(`,直接將其壓入棧頂,直到遇見右括號`)` 才將其中間的所有運算符彈出到輸出棧,且將`(`與`)`彈出(丟棄,非彈出至輸出棧) 若掃描完成后運算符棧中還有運算符,將其壓入輸出棧
- 此時將輸出棧逆序一遍,就得后綴表達式
例如我們要將
中綴:2+(4+6)x8-10
轉為后綴:246+8x+10-
:
初始化兩個棧:
outputStack
(輸出棧)以及operatorStack
(運算符棧)數字
2
壓入輸出棧此時運算符棧中無運算符,故
+
號壓入運算符棧遇見
(
無視優先級,直接壓入運算符棧數字
4
壓入輸出棧
+
號壓入運算符棧,因為此時棧頂為(
,(
左括號 只有當遇見右括號)
時才能才能彈出數字
6
壓入輸出棧遇見
)
,此時運算符棧中有(從左到右為棧頂到棧尾):+ ( +
,故將棧頂的+
號彈出至輸出棧,且()
彈出此時運算符棧中只剩下
+
號
x
號優先級比棧頂的+
號高,直接壓入運算符棧棧頂數字
8
直接壓入輸出棧
-
號優先級比運算符棧棧頂的x
號低,此時運算符棧中有:x -
,都大於等於-
號的優先級,故將其全部壓入輸出棧,並將-
號壓入運算符棧數字
10
壓入輸出棧掃描完成,此時運算符棧中還有
-
號,故將其壓入輸出棧此時輸出棧中元素為:
-10+x8+642
逆序得246+8x+10-
后綴表達式的計算:
后綴表達式的計算方法非常簡單,因為復雜的部分都在轉換過程上了 首先申請一個棧來存儲計算結果`resultStack` 從逆序的輸出棧中依次取元素,遇到數字壓入結果棧中 遇運算符則將結果棧中位於棧頂的兩個元素取出做相應的運算, 運算順序為(第二個數字) (運算符) (棧頂數字),並將結果壓入結果棧中 最后結果棧中的數字即為結果
- 用上例所得的后綴表達式為例:
246+8x+10-
- 前三個元素都是數字,故直接壓入結果棧中
- 此時我們的棧中就有:
6(棧頂) 4 2(棧底)
- 繼續掃描,遇到
+
號,則將棧頂的兩個元素取出做加法運算得4+6=10
- 此時棧中有:
10 2
- 繼續掃描,數字
8
壓入棧中- 繼續掃描,遇
x
號,將結果棧棧頂二數字取出做10x8=80
,80
壓入結果棧- 此時數字棧中有:
80 2
- 又遇
+
號,2+80=82
,壓入數字棧- 數字
10
壓入棧- 遇
-
號,82-10=72
, 驗證:2+(4+6)x8-10=72
另附自己的一些Qt框架寫的拙作:X系列