資料結構之棧的應用(算術計算)
棧的應用實戰2-->算術計算
問題的提出:計算機的本質工作就是做數學運算,那計算機可以讀入字串“9 + (3 - 1) * 5 + 8 / 2”並計算值嗎?
波蘭科學家在20世紀50年代提出了一種將運算子放在數字後面的字尾表示式。對應的,我們習慣的數學表示式叫做中綴表示式。
由於中綴表示式符合人類的閱讀和思維習慣,字尾表示式符合計算機的“運算習慣”,所以為了計算機能夠讀入字串並計算出數值,我們需要將中綴表示式轉換成字尾表示式。
那麼問題就出現了,如何將中綴表示式轉換成字尾表示式?
例項:
5 + 3 => 5 3 +
1 + 2 * 3 => 1 2 3 * +
9 + ( 3 – 1 ) * 5 => 9 3 1 – 5 * +
當然了,辦法總比問題多,就這樣,中綴表示式轉換成字尾表示式的演算法就應運而生了。
解決方案:
1.遍歷中綴表示式中的數字和符號;
1.1.對於數字:直接輸出;
1.2.對於符號;
1.2.1.左括號:進棧;
1.2.2.符號:與棧頂符號進行優先順序比較;
1.2.2.1.棧頂符號優先順序低:即比棧頂符號優先順序高,進棧;
1.2.2.2.棧頂符號優先順序不低:即比棧頂符號優先順序低,
將棧頂符號彈出並輸出,之後進棧;
1.2.3.右括號:將棧頂符號彈出並輸出,直到匹配左括號。
2.遍歷結束:將棧中的所有符號彈出並輸出。
演算法框架:
實現程式碼下載地址:http://download.csdn.net/download/u014754841/10244007
這裡只是實現了中綴表示式轉換成字尾表示式轉換,計算機算術計算還沒真正開始,計算機是如何基於字尾表示式計算的?
計算機對字尾表示式的運算是基於棧的,所以我們還得為計算機的計算再建立一個棧。
計算機基於字尾表示式計算的解決方案
1.遍歷字尾表示式中的數字和符號
1.1.對於數字:進棧;
1.2.對於符號:
1.2.1.從棧中彈出右運算元;
1.2.2.從棧中彈出左運算元;
1.2.3.根據符號進行運算;
1.2.4.將運算結果壓入棧中。
2.遍歷結束:棧中的唯一數字為計算結果。
演算法框架
字尾計算實現程式碼下載地址:http://download.csdn.net/download/u014754841/10244015
再次嘮叨一下,作個總結:
1.中綴表示式是人習慣的表達方式。
2.字尾表示式是計算機喜歡的表達方式。
3.通過棧可以方便的將中綴形式變換為字尾形式。
4.中綴表示式的計算過程類似程式編譯執行的過程。
到此,雖有中綴表示式轉換成字尾表示式的程式碼,也有後綴表示式計算的程式碼,但是離輸入算術表示式到計算出結果還有一定的路程需要去趟。要想實現算術計算,還需將這兩個演算法糅合到一起才可。詳請見例項程式碼。
整體程式碼下載地址:http://download.csdn.net/download/u014754841/10244031
控制檯小程式下載地址:http://download.csdn.net/download/u014754841/10244045