棧和佇列是兩種資料儲存型別,而之前說到的氣泡排序、選擇排序和插入排序是建立在陣列上的,而陣列是資料儲存結構。而棧和佇列更多的是作為程式設計師的工具來使用,它們主要作為構思演算法的輔助工具,而不是完全的資料儲存工具。並且,還存在受限訪問(只允許特定時刻只有乙個資料項執行操作)和更加抽象(主要通過介面對它們進行定義,主要實現機制對使用者來說是不可見)的特點。
棧:我的看法是,棧類似於容器,增加乙個元素時,是在棧頂,而移除乙個元素時,也是在棧頂移除。並且,只允許訪問乙個資料項,即最後插入的資料項。這種機制在不少的程式設計環境中都很有用,例如利用棧來檢驗源程式中的小括號、中括號、大括號是否匹配的問題,還有解析算術表示式。它是先進後出。
棧的**如下:
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 迴圈佇列的方法...