本篇文章探討的是,諸如(4+5)x(4-2)這樣的運(yùn)算編程語(yǔ)言是如何識(shí)別括號(hào)并進(jìn)行運(yùn)算的唁情?我們知道4+5=9 4-2=2加上括號(hào)以后編程語(yǔ)言在編譯的過(guò)程當(dāng)中又是如何進(jìn)行運(yùn)算的呢?
這其中的原理其實(shí)很簡(jiǎn)單镜豹,我們可以使用雙棧的方法解決有括號(hào)的運(yùn)算問(wèn)題傲须。
棧是啥?
簡(jiǎn)單的說(shuō)棧是一種簡(jiǎn)單的線性表趟脂,我們只可以向這個(gè)線性表的一端進(jìn)行插入和刪除的操作泰讽,插入的新元素始終都會(huì)在舊棧的上面,如果你想刪除舊棧需要移走新棧才能再進(jìn)行刪除昔期。棧的特性就是先進(jìn)后出已卸,即最先進(jìn)入的棧會(huì)在最后才能取出來(lái)。
詳細(xì)參考百度百科
雙棧方法處理帶括號(hào)的復(fù)合運(yùn)算
1.首先我們有一個(gè)計(jì)算式子(4+5)x(4-2)
2.我們需要兩個(gè)棧硼一,一個(gè)棧用來(lái)存儲(chǔ)數(shù)字咬最,另外一個(gè)棧用來(lái)存儲(chǔ)運(yùn)算符號(hào)即加減乘除
3.每一個(gè)數(shù)字括號(hào)運(yùn)算符號(hào)我們都當(dāng)作字符來(lái)看待。
4.現(xiàn)在從左向右遍歷這一串字符(4+5)x(4-2)
5.忽略所有的左括號(hào)欠动,當(dāng)我們碰見(jiàn)數(shù)字的時(shí)候就將數(shù)字放到數(shù)字棧當(dāng)中永乌,當(dāng)我們碰見(jiàn)運(yùn)算符號(hào)的時(shí)候就將符號(hào)放置到運(yùn)算棧。將4放入數(shù)字棧具伍,然后將+號(hào)放到運(yùn)算棧翅雏,再將數(shù)字5棧放到運(yùn)算棧。
6.關(guān)鍵在這里H搜俊M浮!萤厅,當(dāng)我們遍歷讀取到右括號(hào)的時(shí)候橄抹,開(kāi)始將數(shù)字棧和運(yùn)算棧當(dāng)中的字符一次取出來(lái)進(jìn)行運(yùn)算,我們先取出數(shù)字棧的5惕味,在取出運(yùn)算符棧當(dāng)中的+號(hào)楼誓,最后取出4得到5+4進(jìn)行運(yùn)算,將結(jié)果9重新存入已經(jīng)取空的棧當(dāng)中(剛才操作取空的)
之后我們看到的棧應(yīng)該入上圖所示名挥。
7.之后我們繼續(xù)遍歷原來(lái)的算式疟羹,將x存入運(yùn)算棧當(dāng)中,忽略所有左括號(hào)禀倔,將數(shù)字4存入數(shù)字棧當(dāng)中榄融,將-號(hào)存入運(yùn)算棧當(dāng)中,將數(shù)字2存入數(shù)字棧當(dāng)中救湖。直到我們又碰到一個(gè)右括號(hào)再將棧內(nèi)的元素取出進(jìn)行運(yùn)算愧杯。
8.運(yùn)算的過(guò)程當(dāng)中我們需要注意一個(gè)-號(hào)的問(wèn)題,如果是減號(hào)運(yùn)算的話(huà)鞋既,我們就需要添加一個(gè)-號(hào)來(lái)保證得到的數(shù)字結(jié)果是正確的力九。因?yàn)闂H〕龅臄?shù)字順序是反的會(huì)影響減法運(yùn)算的結(jié)果耍铜。如果是除法運(yùn)算我們就要計(jì)算它的負(fù)一次冪來(lái)保證運(yùn)算的結(jié)果正確。(程序邏輯上這么做來(lái)保證結(jié)果正確)進(jìn)行一次運(yùn)算我們就將結(jié)果重新存入棧當(dāng)中畏邢。
9.最后我們將剩余的數(shù)字和符號(hào)都取出來(lái)進(jìn)行運(yùn)算就可以得到結(jié)果了业扒。
總結(jié)
雙棧方法就是比較簡(jiǎn)單的編程語(yǔ)言進(jìn)行帶括號(hào)的復(fù)合運(yùn)算的計(jì)算方法,以上僅僅是運(yùn)算流程和思路舒萎,真正實(shí)現(xiàn)的過(guò)程當(dāng)中還會(huì)遇到一些實(shí)際問(wèn)題需要解決程储。