本文是介紹使用Visual C#實(shí)現(xiàn)自動(dòng)計(jì)算四則混合運(yùn)算的一種方法,在.net1.1框架中,還沒(méi)有包含全現(xiàn)成的類(lèi),不過(guò),現(xiàn)在經(jīng)過(guò)我們下文的介紹,大家完全可以自己寫(xiě)一個(gè),作用嘛,沒(méi)什么,就是熟悉一下棧的用法,或者家里有上小學(xué)的,可以寫(xiě)一個(gè)程序給孩子練習(xí)一下四則混合運(yùn)算也行,哈哈,廢話不多說(shuō)了,講正題吧。
出一個(gè)典型的算術(shù)題: (6+2*5)/4
從題中,我們首先算 2*5=10 接下來(lái)算 6+10=16 最后算 16/4 =4 所以,結(jié)果是4
計(jì)算機(jī)怎么算?還好前輩給我們列出來(lái)一堆的算法,我們隨便選一個(gè)就可以了。
第一種算法
使用棧來(lái)解決,意思就是把不優(yōu)極最低的壓到棧的最下面去,按照先進(jìn)后出的原則,那么先級(jí)最低的就是最后計(jì)算了。
計(jì)算過(guò)程:
我們建立兩個(gè)棧,一個(gè)是數(shù)據(jù)棧,一個(gè)是計(jì)算符號(hào)棧,以(6+2*5)/4為例子,看看倒底是怎么計(jì)算的。
假設(shè):
1)優(yōu)先級(jí)
符號(hào)之間的優(yōu)先級(jí)如下:
“(“ “)” -1
“+”,”-” 0
“*”,”/” 1
數(shù)值越大,則越優(yōu)先,同級(jí)別的比較時(shí) 先出現(xiàn)的優(yōu)先。
2)將”(”,”)”設(shè)為特殊運(yùn)算符,即單目運(yùn)算,兩鄰兩個(gè)運(yùn)算符則可對(duì)消。
3) 計(jì)算條件
(1) 當(dāng)前運(yùn)算符不等于“”(特殊結(jié)束符)
(2) 運(yùn)算符棧里的運(yùn)行算個(gè)數(shù)>=1時(shí)
(3) 出??诘倪\(yùn)算符優(yōu)先級(jí)高于將要入棧的運(yùn)算符時(shí)或者兩者可對(duì)消時(shí)。
計(jì)算時(shí),則將符號(hào)出棧參與計(jì)算,數(shù)值棧的出??谇皟晌辉爻鰲⑴c計(jì)算,計(jì)算結(jié)果值向數(shù)值棧壓棧,并進(jìn)行遞歸此操作。
1) “(” 壓入符號(hào)棧 2 ) “6”壓入數(shù)值棧
3) “(”與”+”比較優(yōu)先級(jí),認(rèn)為”(”比”+”優(yōu)先級(jí)低,則不滿足計(jì)算條件,將”+”壓入符號(hào)棧.
1) 將”2” 壓入數(shù)值棧。
2) 將”*”與”+”比較優(yōu)先級(jí),算得”+”優(yōu)先級(jí)低于”*”,則不滿足計(jì)算條件,將”*”壓入符號(hào)棧。
1) 將 “5”壓入數(shù)植棧。 2) 將“*“與”)”比較優(yōu)先級(jí),得出”*”比”)”優(yōu)先級(jí)要高。進(jìn)行計(jì)算,將”*”出棧、”5”、”2”出棧,參與計(jì)算
1) 將 2*5 =10的結(jié)果壓入數(shù)值棧。
2) (遞歸)比較 “+”與”)”優(yōu)先級(jí),得出”+”比”)”優(yōu)先級(jí)要高。再進(jìn)行計(jì)算,將”+”出棧、”10”、”6”出棧,參與計(jì)算。
1) 將 6+10 =16的結(jié)果壓入數(shù)值棧。
2) (遞歸)比較 “)”與”(”優(yōu)先級(jí),得出兩者可以對(duì)消,將”(”符號(hào)出棧,與”)”對(duì)消,繼續(xù)取下一個(gè)符號(hào)。
1) 將”/”入符號(hào)棧。
2)將”4”入數(shù)值棧。
3) 發(fā)現(xiàn)””算式結(jié)束符,則進(jìn)行計(jì)算, 將 “/”、”4’、”16”出棧,參與計(jì)算。
1) 將計(jì)算結(jié)果壓入數(shù)值棧。
成功了! 辛苦的計(jì)算工作終于干完了,看起來(lái)比人腦計(jì)算復(fù)雜多了:)
第二種算法
第二種方法,我們簡(jiǎn)單的提一下,在這里不作詳細(xì)過(guò)程的敘述。第二種,就是使用樹(shù)的方式,將一個(gè)算式組織成一定規(guī)律的樹(shù),之后,再進(jìn)行遍歷計(jì)算即得得到結(jié)果。還是以上面的算式作例子,最終形成的樹(shù)的樣式:(注意“()”這個(gè)符號(hào)要特殊處理)
使用樹(shù)的深度遍歷即可算出最終的結(jié)果。
出一個(gè)典型的算術(shù)題: (6+2*5)/4
從題中,我們首先算 2*5=10 接下來(lái)算 6+10=16 最后算 16/4 =4 所以,結(jié)果是4
計(jì)算機(jī)怎么算?還好前輩給我們列出來(lái)一堆的算法,我們隨便選一個(gè)就可以了。
第一種算法
使用棧來(lái)解決,意思就是把不優(yōu)極最低的壓到棧的最下面去,按照先進(jìn)后出的原則,那么先級(jí)最低的就是最后計(jì)算了。
計(jì)算過(guò)程:
我們建立兩個(gè)棧,一個(gè)是數(shù)據(jù)棧,一個(gè)是計(jì)算符號(hào)棧,以(6+2*5)/4為例子,看看倒底是怎么計(jì)算的。
假設(shè):
1)優(yōu)先級(jí)
符號(hào)之間的優(yōu)先級(jí)如下:
“(“ “)” -1
“+”,”-” 0
“*”,”/” 1
數(shù)值越大,則越優(yōu)先,同級(jí)別的比較時(shí) 先出現(xiàn)的優(yōu)先。
2)將”(”,”)”設(shè)為特殊運(yùn)算符,即單目運(yùn)算,兩鄰兩個(gè)運(yùn)算符則可對(duì)消。
3) 計(jì)算條件
(1) 當(dāng)前運(yùn)算符不等于“”(特殊結(jié)束符)
(2) 運(yùn)算符棧里的運(yùn)行算個(gè)數(shù)>=1時(shí)
(3) 出??诘倪\(yùn)算符優(yōu)先級(jí)高于將要入棧的運(yùn)算符時(shí)或者兩者可對(duì)消時(shí)。
計(jì)算時(shí),則將符號(hào)出棧參與計(jì)算,數(shù)值棧的出??谇皟晌辉爻鰲⑴c計(jì)算,計(jì)算結(jié)果值向數(shù)值棧壓棧,并進(jìn)行遞歸此操作。
1) “(” 壓入符號(hào)棧 2 ) “6”壓入數(shù)值棧
3) “(”與”+”比較優(yōu)先級(jí),認(rèn)為”(”比”+”優(yōu)先級(jí)低,則不滿足計(jì)算條件,將”+”壓入符號(hào)棧.
1) 將”2” 壓入數(shù)值棧。
2) 將”*”與”+”比較優(yōu)先級(jí),算得”+”優(yōu)先級(jí)低于”*”,則不滿足計(jì)算條件,將”*”壓入符號(hào)棧。
1) 將 “5”壓入數(shù)植棧。 2) 將“*“與”)”比較優(yōu)先級(jí),得出”*”比”)”優(yōu)先級(jí)要高。進(jìn)行計(jì)算,將”*”出棧、”5”、”2”出棧,參與計(jì)算
1) 將 2*5 =10的結(jié)果壓入數(shù)值棧。
2) (遞歸)比較 “+”與”)”優(yōu)先級(jí),得出”+”比”)”優(yōu)先級(jí)要高。再進(jìn)行計(jì)算,將”+”出棧、”10”、”6”出棧,參與計(jì)算。
1) 將 6+10 =16的結(jié)果壓入數(shù)值棧。
2) (遞歸)比較 “)”與”(”優(yōu)先級(jí),得出兩者可以對(duì)消,將”(”符號(hào)出棧,與”)”對(duì)消,繼續(xù)取下一個(gè)符號(hào)。
1) 將”/”入符號(hào)棧。
2)將”4”入數(shù)值棧。
3) 發(fā)現(xiàn)””算式結(jié)束符,則進(jìn)行計(jì)算, 將 “/”、”4’、”16”出棧,參與計(jì)算。
1) 將計(jì)算結(jié)果壓入數(shù)值棧。
成功了! 辛苦的計(jì)算工作終于干完了,看起來(lái)比人腦計(jì)算復(fù)雜多了:)
第二種算法
第二種方法,我們簡(jiǎn)單的提一下,在這里不作詳細(xì)過(guò)程的敘述。第二種,就是使用樹(shù)的方式,將一個(gè)算式組織成一定規(guī)律的樹(shù),之后,再進(jìn)行遍歷計(jì)算即得得到結(jié)果。還是以上面的算式作例子,最終形成的樹(shù)的樣式:(注意“()”這個(gè)符號(hào)要特殊處理)
使用樹(shù)的深度遍歷即可算出最終的結(jié)果。

