本文是介紹使用Visual C#實現自動計算四則混合運算的一種方法,在.NET1.1框架中,還沒有包含全現成的類,不過,現在經過我們下文的介紹,大家完全可以自己寫一個,作用嘛,沒什麼,就是熟悉一下棧的用法,或者家裡有上小學的,可以寫一個程序給孩子練習一下四則混合運算也行,哈哈,廢話不多說了,講正題吧。
出一個典型的算術題: (6+2*5)/4
從題中,我們首先算 2*5=10 接下來算 6+10=16 最後算 16/4 =4 所以,結果是4
計算機怎麼算?還好前輩給我們列出來一堆的算法,我們隨便選一個就可以了。
第一種算法
使用棧來解決,意思就是把不優極最低的壓到棧的最下面去,按照先進後出的原則,那麼最優先級最低的就是最後計算了。
計算過程:
我們建立兩個棧,一個是數據棧,一個是計算符號棧,以(6+2*5)/4為例子,看看倒底是怎麼計算的。
假設:
1)優先級
符號之間的優先級如下:
“(“ “)” -1
“+”,”-” 0
“*”,”/” 1
數值越大,則越優先,同級別的比較時 先出現的優先。
2)將”(”,”)”設為特殊運算符,即單目運算,兩鄰兩個運算符則可對消。
3) 計算條件
(1) 當前運算符不等於“”(特殊結束符)
(2) 運算符棧裡的運行算個數>=1時
(3) 出棧口的運算符優先級高於將要入棧的運算符時或者兩者可對消時。
計算時,則將符號出棧參與計算,數值棧的出棧口前兩位元素出棧參與計算,計算結果值向數值棧壓棧,並進行遞歸此操作。
圖1:
1) “(” 壓入符號棧 2 ) “6”壓入數值棧
3) “(”與”+”比較優先級,認為”(”比”+”優先級低,則不滿足計算條件,將”+”壓入符號棧.
圖2:
1) 將”2” 壓入數值棧。
2) 將”*”與”+”比較優先級,算得”+”優先級低於”*”,則不滿足計算條件,將”*”壓入符號棧。
圖3:
1) 將 “5”壓入數植棧。 2) 將“*“與”)”比較優先級,得出”*”比”)”優先級要高。進行計算,將”*”出棧、”5”、”2”出棧,參與計算
圖4:
1) 將 2*5 =10的結果壓入數值棧。
2) (遞歸)比較 “+”與”)”優先級,得出”+”比”)”優先級要高。再進行計算,將”+”出棧、”10”、”6”出棧,參與計算。
圖 5:
1) 將 6+10 =16的結果壓入數值棧。
2) (遞歸)比較 “)”與”(”優先級,得出兩者可以對消,將”(”符號出棧,與”)”對消,繼續取下一個符號。
圖6:
1) 將”/”入符號棧。
2)將”4”入數值棧。
3) 發現””算式結束符,則進行計算, 將 “/”、”4’、”16”出棧,參與計算。
圖7:
1) 將計算結果壓入數值棧。
成功了! 辛苦的計算工作終於干完了,看起來比人腦計算復雜多了:)
第二種算法
第二種方法,我們簡單的提一下,在這裡不作詳細過程的敘述。第二種,就是使用樹的方式,將一個算式組織成一定規律的樹,之後,再進行遍歷計算即得得到結果。還是以上面的算式作例子,最終形成的樹的樣式:(注意“()”這個符號要特殊處理)
圖8:
使用樹的深度遍歷即可算出最終的結果。