前言
棧和隊列是web開發中最常用的兩種數據結構。絕大多數用戶,甚至包括web開發人員,都不知道這個驚人的事實。如果你是一個程序員,那么請聽我講兩個啟發性的例子:使用堆棧來組織數據,來實現文本編輯器的“撤消”操作;使用隊列處理數據,實現web瀏覽器的事件循環處理事件(單擊click、懸停hoover等)。
等等,先想象一下我們作為用戶和程序員,每天使用棧和隊列的次數,這太驚人了吧!由于它們在設計上有普遍性和相似性,我決定從這里開始為大家介紹數據結構。
棧
在計算機科學中,棧是一種線性數據結構。如果你理解起來有困難,就像最初非常困惑的我一樣,不妨這樣認為:一個棧可以對數據按照順序進行組織和管理。
要理解這種順序,我們可以把棧這種結構想象為自助餐廳的一堆盤子,當一個盤子被疊加到一堆盤子上時,原有的盤子保留了它們原來的順序;同時,當一個新盤子被添加時,它會朝棧的底部方向堆積。每當我們添加一個新盤子時,被稱作入棧,這個新盤子處于棧的頂部,也被稱作棧頂。
這個添加盤子的過程會保留每個盤子被添加到棧中的順序,每次從棧中取出一個盤子時也是一樣的。我可能用了太多的篇幅來描述自助餐廳中的盤子是怎樣被添加和刪除的過程。
為了是大家理解棧更多的技術細節,讓我們回顧一下前面關于文本編輯器的“撤消”操作。每次將文本添加到文本編輯器事,該文本被壓入棧中。其中第一次添加的文本代表棧的底部(棧底);最后一次的修改表示棧的頂部(棧頂)。如果用戶希望撤銷最后一次修改,則刪除處于棧的頂部的那段文本,這個過程可以不斷重復,一直到棧中沒有更多內容,這時我們會得到一個空白文件。
棧的操作
現在我們對棧的模型有了基本概念,下一步就要定義棧的兩個操作:
push(data) 添加數據 pop() 刪除最后添加的數據棧的實現
現在讓我們開始為棧編寫代碼吧!
棧的屬性
為了實現棧結構,我們將會創建一個名為 Stack 的構造函數。棧的每個實例都有兩個屬性:_size 和 _storage。
function Stack() {this._size = 0;this._storage = {};}this._storage 屬性使棧的每一個實例都具有自己的用來存儲數據的容器; this._size 屬性反映了當前棧中數據的個數。如果創建了一個新的棧的實例,并且有一個數據被存入棧中,那么 this._size 的值將被增加到1。如果又有數據入棧,this._size 的值將增加到2。如果一個數據從棧中被取出,this._size 的值將會減少為1。
棧的方法(操作)
我們需要定義可以向棧中添加(入棧)和從棧中取出(出棧)數據的方法。讓我們從添加數據開始。
新聞熱點
疑難解答
圖片精選