“棧”與“佇列”呢點事(三)

弒曉風發表於2019-02-25

本文主要分享了佇列的實現原理,和基於佇列的幾種應用場景。佇列和棧的實現原理,雖然很簡單,但是萬丈高樓平地起,盤龍臥虎高山齊。由簡入繁,至臻化境,拈手即來。


所有原始碼均已上傳至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

“棧”與“佇列”呢點事(三)

您的點贊和關注是對我最大的支援,謝謝!


相關文章