資料機構 棧和佇列

2021-09-03 01:55:00 字數 1937 閱讀 7894

· 一種線性結構

· 相比陣列,棧對應的操作是陣列的乙個子集

· 只能從一段新增和取出元素(這一端稱為棧頂)

· 棧是一種後進先出的資料結構——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 是在葉子結點和權重確定的情況下,帶權路徑長度最小的二叉樹,也被稱為最優二叉樹。看到這個定義我是一臉懵逼的,什麼葉子節點和權重還好,那麼路徑是指什麼呢,乙個節點到另乙個節點之間的途徑?而且帶權路徑長度又是指什麼呢?什麼是路徑?在...