1. 程式人生 > >棧的應用——Dijkstra雙棧演算法表示式求值演算法

棧的應用——Dijkstra雙棧演算法表示式求值演算法

一、演算法原理:

表示式由括號、運算符合運算元(數字)組成。我們根據以下4種情況從左到右逐個將這些實數送入棧處理:

1、將運算元壓入運算元棧;

2、將運算子壓入運算子棧;

3、忽略左括號;

4、在遇到右括號時,彈出一個運算子,彈出所需數量的運算元,並將運算子和運算元的運算結果壓入運算元棧。

在處理完最後一個右括號之後,運算元棧上只會有一個值,它就是表示式。這種方法乍一看有些難以理解,但要證明它能夠計算得到正確的值很簡單:每當演算法遇到一個被括號包圍並由一個運算子和兩個運算元組成的子表示式時,它都將運算子和操作室的計算結果壓入運算元棧。這樣的結果就好像在輸入中用這個值代替了該子表示式,因此用這個值代替子表示式得到的結果和原表示式相同。我們可以反覆應用這個規律並得到一個最終值。

二、演算法程式碼表示:

下面的Evaluate類是該演算法的一個實現。這段程式碼是一個簡單的“直譯器”:一個能夠解釋給定字串所表達的運算並計算得到結果的程式。

三、演算法的執行軌跡圖

以式子(1+((2+3)*(4+5)))為例,下面展示一下該演算法執行時的軌跡圖: