本篇文章探討的是,諸如(4+5)x(4-2)這樣的運(yùn)算編程語言是如何識(shí)別括號并進(jìn)行運(yùn)算的?我們知道4+5=9 4-2=2加上括號以后編程語言在編譯的過程當(dāng)中又是如何進(jìn)行運(yùn)算的呢?
這其中的原理其實(shí)很簡單,我們可以使用雙棧的方法解決有括號的運(yùn)算問題。
棧是啥?
簡單的說棧是一種簡單的線性表,我們只可以向這個(gè)線性表的一端進(jìn)行插入和刪除的操作,插入的新元素始終都會(huì)在舊棧的上面,如果你想刪除舊棧需要移走新棧才能再進(jìn)行刪除。棧的特性就是先進(jìn)后出,即最先進(jìn)入的棧會(huì)在最后才能取出來。

詳細(xì)參考百度百科
雙棧方法處理帶括號的復(fù)合運(yùn)算
1.首先我們有一個(gè)計(jì)算式子(4+5)x(4-2)
2.我們需要兩個(gè)棧,一個(gè)棧用來存儲(chǔ)數(shù)字,另外一個(gè)棧用來存儲(chǔ)運(yùn)算符號即加減乘除

3.每一個(gè)數(shù)字括號運(yùn)算符號我們都當(dāng)作字符來看待。
4.現(xiàn)在從左向右遍歷這一串字符(4+5)x(4-2)
5.忽略所有的左括號,當(dāng)我們碰見數(shù)字的時(shí)候就將數(shù)字放到數(shù)字棧當(dāng)中,當(dāng)我們碰見運(yùn)算符號的時(shí)候就將符號放置到運(yùn)算棧。將4放入數(shù)字棧,然后將+號放到運(yùn)算棧,再將數(shù)字5棧放到運(yùn)算棧。

6.關(guān)鍵在這里?。。?,當(dāng)我們遍歷讀取到右括號的時(shí)候,開始將數(shù)字棧和運(yùn)算棧當(dāng)中的字符一次取出來進(jìn)行運(yùn)算,我們先取出數(shù)字棧的5,在取出運(yùn)算符棧當(dāng)中的+號,最后取出4得到5+4進(jìn)行運(yùn)算,將結(jié)果9重新存入已經(jīng)取空的棧當(dāng)中(剛才操作取空的)

之后我們看到的棧應(yīng)該入上圖所示。
7.之后我們繼續(xù)遍歷原來的算式,將x存入運(yùn)算棧當(dāng)中,忽略所有左括號,將數(shù)字4存入數(shù)字棧當(dāng)中,將-號存入運(yùn)算棧當(dāng)中,將數(shù)字2存入數(shù)字棧當(dāng)中。直到我們又碰到一個(gè)右括號再將棧內(nèi)的元素取出進(jìn)行運(yùn)算。

8.運(yùn)算的過程當(dāng)中我們需要注意一個(gè)-號的問題,如果是減號運(yùn)算的話,我們就需要添加一個(gè)-號來保證得到的數(shù)字結(jié)果是正確的。因?yàn)闂H〕龅臄?shù)字順序是反的會(huì)影響減法運(yùn)算的結(jié)果。如果是除法運(yùn)算我們就要計(jì)算它的負(fù)一次冪來保證運(yùn)算的結(jié)果正確。(程序邏輯上這么做來保證結(jié)果正確)進(jìn)行一次運(yùn)算我們就將結(jié)果重新存入棧當(dāng)中。

9.最后我們將剩余的數(shù)字和符號都取出來進(jìn)行運(yùn)算就可以得到結(jié)果了。
總結(jié)
雙棧方法就是比較簡單的編程語言進(jìn)行帶括號的復(fù)合運(yùn)算的計(jì)算方法,以上僅僅是運(yùn)算流程和思路,真正實(shí)現(xiàn)的過程當(dāng)中還會(huì)遇到一些實(shí)際問題需要解決。