· 一種線性結構
· 相比陣列,棧對應的操作是陣列的乙個子集
· 只能從一段新增和取出元素(這一端稱為棧頂)
· 棧是一種後進先出的資料結構——last in first out (lifo)
如圖 有元素1 2 3 4 進棧順序為 1 2 3 4,最後進棧的元素4最先出棧。
undo操作(撤銷):例如寫**的時候寫錯的,利用快捷鍵ctrl+z撤銷最近一次的操作,它就是將每次操作儲存在乙個棧中,當執行撤銷操作的時候就將棧頂的元素出棧。
程式呼叫系統棧:
如:現有三個函式a呼叫b,b呼叫c。
從a開始執行到第二行a2的時候去執行b函式,此時將記錄的a2入棧,然後執行b到b2的時候將用於記錄的b2入棧,然後執行c。
c沒有子函式跳轉所以不需要記錄,執行完了c,此時找到棧頂元素b2將其出棧,就知道接下來應該接著執行函式b的b2後面一行,b函式執行完後將找到棧頂元素a2將其出棧,然後執行a函式a2後面一行,函式執行完成,此時棧為空,則此次函式呼叫完成。
github:
public class arraystackimplements stack
public arraystack()
@override
public int getsize()
@override
public boolean isempty()
public int getcapacity()
@override
public void push(e e)
@override
public e pop()
@override
public e peek()
@override
public string tostring()
return res.tostring();}}
時間複雜度:均為o(1)
這裡底層用的動態陣列實現,也可以用鍊錶,樹等其他資料結構實現。
特性:·佇列也是 一種線性資料結構
·相比陣列,佇列對應的操作是陣列的子集
·只能從一端(隊尾)新增元素,只能從另一端(隊首)取出元素
· 棧是一種先進先出的資料結構——first in first out (fifo)
新增順序:1 2 3 出隊順序;1 2 3
實現:佇列的底層可以用陣列來實現,也可以用鍊錶,樹等來實現
**見github arryqueue
時間複雜度:如果是動態陣列數現,那麼由於出隊需要將元素全部往前移動乙個位置,所以出隊為o(n),其他為o(1)
核心就是在基本的佇列的基礎上,把動態陣列想像成首尾相連接的,實現的時候新增兩個變數front、tail,來分別記錄隊頭和隊尾對應的索引。出隊入隊,就操作front、tail索引對應的元素。
當然還需要判斷一些臨界條件如:當tail指向最後乙個元素時在新增元素,此時應判斷陣列頭是否還有空間有就該新增到陣列頭;當front == tail時則隊列為空。具體**見github loopqueue。
迴圈佇列出隊操作就不需要移動元素在陣列中的位置,從而使得出隊時間複雜度也為o(1)。
資料機構概述概念整理
邏輯結構 是指資料物件中資料元素之間的相互關係 1.集合結構 集合結構 集合結構中的資料元素除了同屬於乙個集合外,它們之間沒有關 系。2.線性結構 線性結構 統性結構中的資料元素之間是一對一的關係.3.樹形結構 樹形結構 樹形結構中的資料元素之間存在一種一對多的層次關係 4 圖形結構 圖形結構 圖形...
演算法和資料機構學習筆記之佇列
init 初始化操作 enquene self,item 若佇列存在,插入新元素item到佇列中,並成為隊尾元素 dequene self 刪除佇列中隊頭元素,並返回隊頭元素 思路 陣列實現佇列時,要注意,隨著不斷進隊,出隊,head和tail都會持續往後移動。當tail移動到最右邊,即使陣列中還有...
資料機構 哈夫曼樹
什麼是哈夫曼樹?先來看哈夫曼樹的定義 哈夫曼樹 huffman tree 是在葉子結點和權重確定的情況下,帶權路徑長度最小的二叉樹,也被稱為最優二叉樹。看到這個定義我是一臉懵逼的,什麼葉子節點和權重還好,那麼路徑是指什麼呢,乙個節點到另乙個節點之間的途徑?而且帶權路徑長度又是指什麼呢?什麼是路徑?在...