上個視頻寫了個簡易計算器,算個簡單的加減乘除還行,但是如果來個混合運算,或者加個括號,這幾行代碼就差的太多了。
處理這種混合運算,不得不提到數據結構中的棧。
我們平時寫的這種表達式,叫做中綴表達式,非常符合人的正常思維,但是計算機計算的話不方便。
中綴表達式可以轉換成后綴表達式,這種表達式看起來抽象一些,但是不需要括號或者優(yōu)先級,計算機計算的話比較方便。
整個過程有點復雜,分的情況比較多,就以這個表達式為例。
首先是把中綴表達式轉換成后綴表達式,需要用到一個棧,來存放運算符。
開始遍歷字符串。
遇到數字,直接寫下來。后面是加號,如果此時棧是空棧,符號直接進棧;再往后,左括號,左括號直接進棧;數字 1 直接寫下來;再往后是加號,如果棧頂是左括號,加號直接進棧;1 寫下來;后面是右括號,右括號不用進棧,此時讓加號出棧;左右括號遇到一起,可以讓左括號出棧,兩個括號直接丟掉就行;后面遇到乘號,因為乘號優(yōu)先級比加號高,乘號直接進棧;2 寫下來;遇到減號,因為減號的優(yōu)先級不高于乘號,所以乘號出棧;減號的優(yōu)先級同樣不高于加號,加號出棧;此時棧變成空棧,減號入棧;最后把 1 寫下來;表達式遍歷結束,減號出棧。
這個表達式就是后綴表達式。
計算后綴表達式也需要一個棧,方法就是,遇到數字進棧,遇到運算符就出來兩個數字,運算后把結果進棧。
前面的 2 1 1 分別進棧;遇到加號,1 和 1 出棧,計算得到 2 再進棧;2 進棧;遇到乘號,2 和 2 出棧計算得到 4,4進棧;遇到加號,4 和 2 出棧,計算得到 6,6 進棧;數字 1 進棧;最后是減號,1 出棧,6 出棧,用后出棧的減去先出棧的,結果是 5,5進棧。
最后留在棧里面的就是結果。
這個過程很復雜,寫代碼之前需要對各種情況分類。
這里直接貼出代碼,如果有需要,評論區(qū)留言代碼,我私信發(fā)你。
代碼寫出來后簡單的測試了幾個,沒什么問題,如果大家在使用中有什么問題,歡迎來交流。
-
數字
+關注
關注
1文章
1700瀏覽量
52555 -
運算
+關注
關注
0文章
132瀏覽量
26722
原文標題:用棧實現四則運算
文章出處:【微信號:學益得智能硬件,微信公眾號:學益得智能硬件】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
回調函數例子的應用
運算放大器的核心組成與典型結構
使用TFTP實現IAP的方法
如何巧妙甚至避免單片機的干擾問題
單片機串口調試的巧妙方法分享
在Keil5中查看棧大小
第4章 C語言基礎以及流水燈的實現(4.3 4.4)
定點數表示實數的方法以及定點數在硬件上的運算驗證
e203乘法運算結構及算法原理
e203 ALU乘法運算結構及算法原理
利用e203中NICE協(xié)處理器加速濾波運算
如何利用Trace機制實現LLCP預覽功能
三種藍牙架構實現方案(藍牙協(xié)議棧方案)
利用棧結構實現四則運算的巧妙方法
評論