Java队列实现(java注释@)
一、隊列簡單介紹
隊列是一種常用的數(shù)據(jù)結(jié)構(gòu)之一,與之前的棧類似,不過隊列是“先進(jìn)先出”。隊列有隊頭(front)和隊尾(rear),數(shù)據(jù)從隊尾進(jìn)入隊列,從隊頭出隊列,隊頭(front)指向隊列的第一個數(shù)據(jù),隊尾(rear)指向隊列中的最后一個數(shù)據(jù)。
二、隊列實(shí)現(xiàn)
隊列有很多種,這里只是介紹最基本的實(shí)現(xiàn),采用鏈?zhǔn)酱鎯Γ簿褪擎準(zhǔn)疥犃校c之前的鏈表存儲形式一樣,通過結(jié)點(diǎn)對象描述一個數(shù)據(jù),結(jié)點(diǎn)對象包含具體數(shù)據(jù)和下一個結(jié)點(diǎn)的引用。
1、創(chuàng)建節(jié)點(diǎn)類
結(jié)點(diǎn)類就跟創(chuàng)建鏈表的結(jié)點(diǎn)類一樣。
public class Node<T> {
// 存儲的數(shù)據(jù)
private T data;
// 下一個節(jié)點(diǎn)的引用
private Node<T> next;
public Node(T data) {
this.data = data;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public Node<T> getNext() {
return next;
}
public void setNext(Node<T> next) {
this.next = next;
}
}
2、創(chuàng)建隊列類LinkQueue
在LinkQueue類中成員變量及方法如下:
成員變量:front、rear、size
對應(yīng)的行為方法有:入隊、出隊、獲取隊列元素個數(shù)、判斷隊列是否為空。
public class LinkQueue<T> {
// 隊頭
private Node<T> front;
// 隊尾
private Node<T> rear;
// 元素個數(shù)
private int size;
/** * 創(chuàng)建隊列 */
public LinkQueue() {
rear = front = null;
}
/** * 入隊列 * * @param data */
public void enQueue(T data) {
Node<T> node = new Node<T>(data);
if (isEmputy()) {
front = rear = node;
} else {
rear.setNext(node);
rear = node;
}
size++;
}
/** * 出隊列 * * @return 返回數(shù)據(jù) */
public T deQueue() {
if (isEmputy()) {
throw new RuntimeException("隊列為空");
}
Node<T> delete = front;
front = delete.getNext();
delete.setNext(null);; // help GC
size--;
if (size == 0) {
// 刪除掉最后一個元素時,front值已經(jīng)為null,但rear還是指向該節(jié)點(diǎn),需要將rear置為null
// 最后一個結(jié)點(diǎn)front和rear兩個引用都沒指向它,幫助GC處理該節(jié)點(diǎn)對象
rear = front;
}
return (T) delete.getData();
}
/** * 判斷隊列是否為空 * @return */
public boolean isEmputy() {
return (front == null && rear == null) ? true : false;
}
/** * 獲取隊列的元素個數(shù) * @return */
public int size() {
return this.size;
}
}
當(dāng)創(chuàng)建隊列時隊列中沒有數(shù)據(jù),front和rear的值都為null。當(dāng)插入第一個數(shù)據(jù)時,將front和rear都指向第一個結(jié)點(diǎn)對象
后續(xù)在插入數(shù)據(jù)時就利用rear進(jìn)行數(shù)據(jù)的插入。
3、測試
測試代碼及結(jié)果如下:
public static void main(String[] args) {
LinkQueue<Integer> queue = new LinkQueue<Integer>();
queue.enQueue(1);
queue.enQueue(2);
queue.enQueue(3);
queue.enQueue(4);
System.out.println("size:" + queue.size());
System.out.println("出隊列:" + queue.deQueue());
System.out.println("出隊列:" + queue.deQueue());
System.out.println("出隊列:" + queue.deQueue());
System.out.println("出隊列:" + queue.deQueue());
System.out.println("刪完重新添加==============");
queue.enQueue(11);
queue.enQueue(22);
queue.enQueue(33);
queue.enQueue(44);
System.out.println("size:" + queue.size());
System.out.println("出隊列:" + queue.deQueue());
System.out.println("出隊列:" + queue.deQueue());
System.out.println("出隊列:" + queue.deQueue());
System.out.println("出隊列:" + queue.deQueue());
}
size:4
出隊列:1
出隊列:2
出隊列:3
出隊列:4
刪完重新添加==============
size:4
出隊列:11
出隊列:22
出隊列:33
出隊列:44
好了,java隊列的簡單實(shí)現(xiàn)就介紹到這里。
生活不只是敲代碼,如果你或你身邊的人喜歡攝影或者生活的點(diǎn)點(diǎn)滴滴,可以關(guān)注下面的公眾號~
總結(jié)
以上是生活随笔為你收集整理的Java队列实现(java注释@)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: onResume的作用
- 下一篇: 启用shift后门的方法_shift按五