一、隊列簡單介紹
隊列是一種常用的數據結構之一,與之前的棧類似,不過隊列是“先進先出”。隊列有隊頭(front)和隊尾(rear),數據從隊尾進入隊列,從隊頭出隊列,隊頭(front)指向隊列的第一個數據,隊尾(rear)指向隊列中的最后一個數據。
二、隊列實現
隊列有很多種,這里只是介紹最基本的實現,采用鏈式存儲,也就是鏈式隊列,與之前的鏈表存儲形式一樣,通過結點對象描述一個數據,結點對象包含具體數據和下一個結點的引用。
1、創建節點類
結點類就跟創建鏈表的結點類一樣。
public class Node<T> { // 存儲的數據 private T data; // 下一個節點的引用 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、創建隊列類LinkQueue
在LinkQueue類中成員變量及方法如下:
成員變量:front、rear、size
對應的行為方法有:入隊、出隊、獲取隊列元素個數、判斷隊列是否為空。
public class LinkQueue<T> { // 隊頭 private Node<T> front; // 隊尾 private Node<T> rear; // 元素個數 private int size; /** * 創建隊列 */ 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 返回數據 */ 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值已經為null,但rear還是指向該節點,需要將rear置為null // 最后一個結點front和rear兩個引用都沒指向它,幫助GC處理該節點對象 rear = front; } return (T) delete.getData(); } /** * 判斷隊列是否為空 * @return */ public boolean isEmputy() { return (front == null && rear == null) ? true : false; } /** * 獲取隊列的元素個數 * @return */ public int size() { return this.size; } }