與棧「後進先出」(lifo)的特性相對應,應當還有一種「先進先出」(fifo)特性的資料結構,這種資料結構被稱之為佇列(queue)。該結構的實現過程與棧幾乎類似,區別在於每次存入元素和獲取元素的位置不同。
【結構型別】線性結構
【底層實現】動態陣列(arraylist)
【核心方法】
public void enqueue(e e); //入隊
public e dequeue(); //出隊
public e getfront(); //獲取隊首的元素
1. 利用arraylist實現普通佇列
public
class
arrayqueue
implements
queue
/*** 無參構造器:利用預設值對例項域進行初始化
*/public
arrayqueue()
@override
public
void
enqueue
(e e)
@override
public e dequeue()
@override
public e getfront()
@override
public
boolean
isempty()
@override
public
intgetsize()
@override
public string tostring()
res.
("] tail");
return res.
tostring();}}
【改進思想】普通的陣列佇列(arrayqueue)進行出隊操作時,需要將後方的每乙個元素向前移動(時間複雜度為o(n)級別),這導致普通佇列的效能較低。我們期望更改佇列設計,以達到出隊操作不需要對後方元素進行遍歷,並且使得出隊操作完成後所閒置的空間能被迴圈利用。根據這種思想所改良的佇列就稱之為迴圈佇列(loopqueue)。
【改進方法】因為迴圈佇列(loopqueue)具有「空間再利用」的結構性,故底層無法直接使用原生的動態陣列(arraylist)實現,而需要在arraylist的基礎上進行重新改寫。
設計佇列的首/尾索引front和tail,初始化時預留乙個空間長度,令front == tail == 0,此時隊列為空。
當(tail + 1) % data.length == front時,隊列為滿,觸發擴容操作。
縮容操作的觸發條件與arraylist類似,但要注意將預留空間除外。
2. 利用array實現迴圈佇列
public
class
loopqueue
implements
queue
/*** 無參構造器:用預設值初始化例項域
*/public
loopqueue()
/** * 方法:獲取陣列容量
* @return
*/public
intgetcapacity()
@override
public
void
enqueue
(e e)
// 將元素插入隊尾
data[tail]
= e;
// 尾索引後移一位
tail =
(tail +1)
% data.length;
// 元素個數加一
size++;}
@override
public e dequeue()
// 將隊首元素存入臨時變數
e ret = data[front]
;// 移除隊首元素
data[front]
= null;
// 首索引後移一位
front =
(front +1)
% data.length;
// 元素個數減一
size--
;// 當陣列3/4的空間為空時,進行縮容操作,新佇列大小為原來的一半
if(size ==
getcapacity()
/4&& size /2!=
0)// 返回臨時變數
return ret;
}/**
* 方法:對佇列的容量進行調整
* @param capacity 新佇列容量
*/private
void
resize
(int capacity)
// 將陣列變數引用至新陣列
data = newdata;
// 維護首/尾索引
front =0;
tail = size;
}@override
public e getfront()
return data[front];}
@override
public
boolean
isempty()
@override
public
intgetsize()
@override
public string tostring()
res.
("] tail");
return res.
tostring();}}
3. 利用linkedlist實現迴圈佇列public
class
linkedlistqueue
implements
queue
public
node
(e e)
public
node()
}/**
* 例項域:首/尾指標、元素個數
*/private node head, tail;
private
int size;
/** * 無參構造器:用預設值對變數進行初始化
*/public
linkedlistqueue()
@override
public
void
enqueue
(e e)
else
// 元素個數加一
size++;}
@override
public e dequeue()
// 將待刪除的節點存入臨時變數
node delnode = head;
// 頭指標後移
head = head.next;
// 將待刪除節點指向空
delnode.next = null;
// 判斷陣列是否為空,若為空則將尾指標也賦為空
if(head == null)
// 元素個數減一
size--
;// 返回臨時變數所儲存的元素
return delnode.e;
}@override
public e getfront()
return head.e;
}@override
public
boolean
isempty()
@override
public
intgetsize()
@override
public string tostring()
res.
("null tail");
return res.
tostring();}}
佇列 先進先出
看前面的是什麼型別 指標 普通 出現指標指向空報錯的情況下,傳參不能為空,可以傳個空間的位址給他 queue front next null 從尾進 先進先出 define crt secure no warnings pragma once include include include incl...
佇列實現先進先出
1 入隊,如例 q.push x 將x 接到佇列的末端。2 出隊,如例 q.pop 彈出佇列的第乙個元素,注意,並不會返回被彈出元素的值。3 訪問隊首元素,如例 q.front 即最早被壓入佇列的元素。4 訪問隊尾元素,如例 q.back 即最後被壓入佇列的元素。5 判斷佇列空,如例 q.empty...
Golang實現先進先出佇列
package queue type queue struct type node struct next node func newqueue queue func q queue isempty bool func q queue size int func q queue enqueue it...