本文主要分享了佇列的實現原理,和基於佇列的幾種應用場景。佇列和棧的實現原理,雖然很簡單,但是萬丈高樓平地起,盤龍臥虎高山齊。由簡入繁,至臻化境,拈手即來。
所有原始碼均已上傳至github: 連結
基於陣列實現的順序佇列
1.首先需要初始化陣列,申請一個大小為capacity的記憶體空間,並且初始化隊頭和隊尾指標。
public ArrayQueue(int capacity) {
arrays = new int[capacity];
size = capacity;
head = 0;
tail = 0;
}複製程式碼
2.入隊
public boolean enqueuq(int num){
if (tail == size)
return false;
arrays[tail++] = num;
return true;
}複製程式碼
問題:但是這裡有個問題隨著不停地進行入隊、出隊操作。head和tail一直在持續的向後移動,直到tail到達末端,無法移動,此時雖然有記憶體空間,但是卻不能入隊了。因為需要改造一下:如果沒有空閒空間了,我們只需要在入隊時,再集中觸發一次資料的搬移操作即可。
public boolean enqueue(int num) {
if (tail == size) {
if(head == 0) return false;
//資料搬移
for (int i = head; i < tail; i++) {
arrays[i-head] = arrays[i];
}
tail -= head;
head = 0;
}
arrays[tail++] = num;
return true;
}複製程式碼
改造:再稍加改造就是一個迴圈佇列的入隊
public boolean enqueue(int num) {
if ((tail + 1) % size == head)
return false;
arrays[tail] = num;
tail = (tail + 1) % size;
return true;
}複製程式碼
3.出隊
public int dequeue() {
if (head == tail)
return -1;// 這裡-1表示隊空
int res = arrays[head++];
return res;
}複製程式碼
改造:再稍加改造就是一個迴圈佇列的出隊
public String dequeue() {
if (head == tail)
return -1;
int ret = arrays[head];
head = (head + 1) % size;
return ret;
}複製程式碼
4.測試結果
注意:迴圈佇列一定要確定好隊空和隊滿的判定條件;並且迴圈佇列還有佔用一個陣列的儲存空間。判斷隊滿(tail+1)%n=head(想不明白,畫一畫就知道了)
基於連結串列實現的鏈式佇列
1.入隊
public void enqueue(int num) {
if (tail == null) {
Node node = new Node(num, null);
head = node;
tail = node;
}else {
tail.next = new Node(num, null);
tail = tail.next;
}
}複製程式碼
2.出隊
public int dequeue() {
if(head == null) return -1;//-1表示隊空
int res = head.data;
head = head.next;
if (head == null) {
tail = null;
}
return res;
}複製程式碼
3.測試結果
擴充套件
下一篇將分享走進不一樣的斐波那契數列。
end
您的點贊和關注是對我最大的支援,謝謝!