1. 程式人生 > >資料結構之棧的應用(算術計算)

資料結構之棧的應用(算術計算)

棧的應用實戰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