棧和佇列 一

2021-07-22 15:47:13 字數 1218 閱讀 2126

棧和佇列是兩種資料儲存型別,而之前說到的氣泡排序、選擇排序和插入排序是建立在陣列上的,而陣列是資料儲存結構。而棧和佇列更多的是作為程式設計師的工具來使用,它們主要作為構思演算法的輔助工具,而不是完全的資料儲存工具。並且,還存在受限訪問(只允許特定時刻只有乙個資料項執行操作)和更加抽象(主要通過介面對它們進行定義,主要實現機制對使用者來說是不可見)的特點。

棧:我的看法是,棧類似於容器,增加乙個元素時,是在棧頂,而移除乙個元素時,也是在棧頂移除。並且,只允許訪問乙個資料項,即最後插入的資料項。這種機制在不少的程式設計環境中都很有用,例如利用棧來檢驗源程式中的小括號、中括號、大括號是否匹配的問題,還有解析算術表示式。它是先進後出。

棧的**如下:
public class stack 

public void push(long j)

public long pop()

public long peek()

public boolean isempty()

public boolean isfull()

}

棧的效率:資料項的入棧和出棧的時間複雜度均為常數o(1)。

佇列:佇列的有點像我們在電影院排隊買票的情形。先來到收銀台的人,買完票就先進場。後來到的人,必須等前面的人買完票了,才能輪到他買票進場。即先進先出。

佇列的兩個基本操作:插入和刪除。插入是把資料項放入隊尾,而刪除則是移除隊頭的資料項。隊頭和隊尾分別指向各自資料項所在的下標位置。但這樣可能會遇到乙個問題,即當刪除幾個資料項時,對頭也隨之指向下標更大的資料項,而當此時需要插入乙個新的資料項時,隊尾此時已經指向了最後乙個資料項的下表,那新插入的元素放在**並且隊尾如何指向呢?這個時候,就需要迴圈佇列了。需要隊尾從下標最大數迴繞到下標為0的位置,新的資料項插入到這個位置。

public class queue 

public void insert(long j)

quearray[++rear] = j;

nitems++; }

public long remove()

public long peekfront()

public boolean isempty()

public boolean isfull()

public int size()

}

佇列的時間複雜度也是o(1)。

棧和優先佇列(一)

普通佇列 先進先出 後進後出 堆的基本表示 完全二叉樹 把元素順序排列成數的形狀,不缺父節點 左節點 右節點 不缺這些就是完全元素 二叉樹的性質就是 父節點大於左節點和右節點,左節點大於右節點 用陣列儲存二叉樹 查父節點和左接點 右節點 查父節點 i i 1 2 有虛擬節點 i i 2 查左節點 i...

棧和佇列 單調佇列 單調棧

講解部落格鏈結 一 單調棧 1 什麼是單調棧?單調棧是指乙個棧內部元素具有嚴格單調性 單調遞增,單調遞減 的一種資料結構。2 單調棧的兩個性質 滿足從棧頂到棧底具有嚴格的單調性 滿足後進先出的特徵,越靠近棧底的元素越早的進棧。3 元素進棧的過程 對於當前進棧元素x 如果x 棧頂元素,x 進棧。否則 ...

leetcode探索佇列和棧(一)

對於佇列,我們可以使用動態陣列和指向佇列頭部的索引來實現,當佇列資料較多時,陣列的容量要求較大,一種比較好的改進方法使用陣列實現迴圈佇列。我們來看一下leetcode給出的演示 可以得出 佇列滿時 tail 1 length head length為長度 隊列為空 head tail 迴圈佇列的方法...