上個(gè)視頻寫了個(gè)簡(jiǎn)易計(jì)算器,算個(gè)簡(jiǎn)單的加減乘除還行,但是如果來個(gè)混合運(yùn)算,或者加個(gè)括號(hào),這幾行代碼就差的太多了。
處理這種混合運(yùn)算,不得不提到數(shù)據(jù)結(jié)構(gòu)中的棧。
我們平時(shí)寫的這種表達(dá)式,叫做中綴表達(dá)式,非常符合人的正常思維,但是計(jì)算機(jī)計(jì)算的話不方便。
中綴表達(dá)式可以轉(zhuǎn)換成后綴表達(dá)式,這種表達(dá)式看起來抽象一些,但是不需要括號(hào)或者優(yōu)先級(jí),計(jì)算機(jī)計(jì)算的話比較方便。
整個(gè)過程有點(diǎn)復(fù)雜,分的情況比較多,就以這個(gè)表達(dá)式為例。
首先是把中綴表達(dá)式轉(zhuǎn)換成后綴表達(dá)式,需要用到一個(gè)棧,來存放運(yùn)算符。
開始遍歷字符串。
遇到數(shù)字,直接寫下來。后面是加號(hào),如果此時(shí)棧是空棧,符號(hào)直接進(jìn)棧;再往后,左括號(hào),左括號(hào)直接進(jìn)棧;數(shù)字 1 直接寫下來;再往后是加號(hào),如果棧頂是左括號(hào),加號(hào)直接進(jìn)棧;1 寫下來;后面是右括號(hào),右括號(hào)不用進(jìn)棧,此時(shí)讓加號(hào)出棧;左右括號(hào)遇到一起,可以讓左括號(hào)出棧,兩個(gè)括號(hào)直接丟掉就行;后面遇到乘號(hào),因?yàn)槌颂?hào)優(yōu)先級(jí)比加號(hào)高,乘號(hào)直接進(jìn)棧;2 寫下來;遇到減號(hào),因?yàn)闇p號(hào)的優(yōu)先級(jí)不高于乘號(hào),所以乘號(hào)出棧;減號(hào)的優(yōu)先級(jí)同樣不高于加號(hào),加號(hào)出棧;此時(shí)棧變成空棧,減號(hào)入棧;最后把 1 寫下來;表達(dá)式遍歷結(jié)束,減號(hào)出棧。
這個(gè)表達(dá)式就是后綴表達(dá)式。
計(jì)算后綴表達(dá)式也需要一個(gè)棧,方法就是,遇到數(shù)字進(jìn)棧,遇到運(yùn)算符就出來兩個(gè)數(shù)字,運(yùn)算后把結(jié)果進(jìn)棧。
前面的 2 1 1 分別進(jìn)棧;遇到加號(hào),1 和 1 出棧,計(jì)算得到 2 再進(jìn)棧;2 進(jìn)棧;遇到乘號(hào),2 和 2 出棧計(jì)算得到 4,4進(jìn)棧;遇到加號(hào),4 和 2 出棧,計(jì)算得到 6,6 進(jìn)棧;數(shù)字 1 進(jìn)棧;最后是減號(hào),1 出棧,6 出棧,用后出棧的減去先出棧的,結(jié)果是 5,5進(jìn)棧。
最后留在棧里面的就是結(jié)果。
這個(gè)過程很復(fù)雜,寫代碼之前需要對(duì)各種情況分類。
這里直接貼出代碼,如果有需要,評(píng)論區(qū)留言代碼,我私信發(fā)你。
代碼寫出來后簡(jiǎn)單的測(cè)試了幾個(gè),沒什么問題,如果大家在使用中有什么問題,歡迎來交流。
-
數(shù)字
+關(guān)注
關(guān)注
1文章
1701瀏覽量
52628 -
運(yùn)算
+關(guān)注
關(guān)注
0文章
132瀏覽量
26837
原文標(biāo)題:用棧實(shí)現(xiàn)四則運(yùn)算
文章出處:【微信號(hào):學(xué)益得智能硬件,微信公眾號(hào):學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
十進(jìn)制計(jì)算機(jī)算術(shù)運(yùn)算器“加法器”專利申請(qǐng)解析
RDMA設(shè)計(jì)12:融合以太網(wǎng)協(xié)議棧設(shè)計(jì)1
回調(diào)函數(shù)例子的應(yīng)用
運(yùn)算放大器的核心組成與典型結(jié)構(gòu)
利用棧結(jié)構(gòu)實(shí)現(xiàn)四則運(yùn)算的巧妙方法
評(píng)論