<<漫畫算法>>--數(shù)據(jù)結(jié)構(gòu)之棧和隊(duì)列

大部分記錄均來自小灰漫畫算法

· 區(qū)分物理結(jié)構(gòu)和邏輯結(jié)構(gòu)

以人為例,血肉和骨骼可以看做物理結(jié)構(gòu);精神層面的東西可以看做邏輯結(jié)構(gòu)。
物理結(jié)構(gòu)和邏輯結(jié)構(gòu).png

· 什么是棧
棧是一種線性數(shù)據(jù)結(jié)構(gòu);棧中的元素只能先入后出。實(shí)現(xiàn):Stack和LinkedStack


棧.png

· 什么是隊(duì)列
隊(duì)列是一種線性數(shù)據(jù)結(jié)構(gòu),隊(duì)列中的元素只能先入先出。隊(duì)列的出口端叫對頭,隊(duì)列的入口端叫隊(duì)尾。
為了避免隊(duì)列的空間維持恒定:
在數(shù)組不擴(kuò)容的前提下,利用已出隊(duì)元素留下的空間,讓隊(duì)尾指針重新指揮數(shù)組的首位。一直到隊(duì)尾下標(biāo)+1 % 數(shù)組長度 = 對頭下標(biāo)。需要注意的是,這種做法需要隊(duì)尾指針指向的位置永遠(yuǎn)空出1位,所以隊(duì)列最大容量比數(shù)組長度小1。
public class MyQueue {

//恒定數(shù)組
private int [] array;
//隊(duì)頭
private int front;
//隊(duì)尾
private int end;

public MyQueue(int capacity) {
    this.array = new int[capacity];
}

public int deQueue() throws Exception {
    if(end == front) {
        throw new Exception("隊(duì)列以空");
    }
    int deQueueElement = array[front];
    front = (front + 1) % array.length;
    return deQueueElement;
}

public void enQueue(int element) throws Exception{
    if((end + 1) % array.length == front) {
        throw new Exception("隊(duì)列已滿");
    }
    array[end] = element;
    end = (end + 1) % array.length;
}

}

· 各自的應(yīng)用
棧通常用于對“歷史”的回溯。
隊(duì)列通常用于對“歷史”的回放。重現(xiàn)之前的操作步驟。

雙端隊(duì)列同時實(shí)現(xiàn)了棧和隊(duì)列的優(yōu)點(diǎn)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容