棧(LIFO:後進先出)

棧LIFO

        1)棧是一種限制插入和刪除只能在一個位置上的表。這個位置就是棧頂(top)。普通的清空棧的操作和測試棧是否爲空的操作,都是棧的指令系統的一部分。其中我們能對棧直接進行的操作只有基本操作:push(入棧)、pop(出棧)。push相當於插入,而pop相當於把最後插入的元素刪除。


        一般的模型是,存在某個元素位於棧頂,而該元素是唯一的可見元素。

        2)棧的實現:由於棧是一個表,所以任何實現表的方法都能實現棧。那麼,ArrayList和LinkedList都支持棧的操作。由於棧的操作是常數時間操作,所以,除非在非常獨特的環境下,否則不會出現任何明顯的改進。這種獨特的方法,一種是鏈式結構。一種是數組結構。

        棧的鏈表實現:通過在單鏈表的頂端插入元素來實現push,通過刪除表頂端的元素來實現pop操作。top只是考查表頂端元素並返回它的值。

        棧的數組實現:模仿的是ArrayList的add操作。與每個棧相關的操作是theArray和topOfStack,對於空棧它是-1.爲將某個元素x推入棧中,我們使topOfStack增1,然後將theArray[topOfStack] = x.爲了彈出棧元素,我們置返回值爲theArray[topOfStack],然後使topOfStack-1.棧很有可能是在計算機科學數組之後最基本的數據結構。

        3)後綴表達式

        (原式) 4.99*1.06+5.99+6.99*1.06

        (後綴表達式)4.99 1.06*5.99+6.99 1.06*

        計算這個問題最容易的方法就是使用一個棧。當遇見一個數值時,就把數值壓入棧中;當遇到一個符號時,就作用於從棧中彈出的兩個數上,再將作用的結果壓入棧中。

        計算一個後綴表達式,所花費的時間是O(N),因爲對輸入中的每個元素的處理都是棧的一個操作,相當於是由一些常數時間組起來的時間。注意:當一個後綴表達式給出來時,沒有必要知道計算的優先級。

        4)中綴到後綴的轉換

        這裏我們堅持普通的優先級法則

        例如:中綴表達式   a+b*c+(d*e+f)*g

                    後綴表達式   abc*+de*f+g*+3.

        


發佈了39 篇原創文章 · 獲贊 15 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章