java佇列的連結串列實現
阿新 • • 發佈:2018-11-27
package Interface; /** * 佇列介面 * <p> * 佇列是一種先進先出的線性表 * 只能在表的一端進行插入,另一段進行刪除 * 允許插入的一端叫隊尾,允許刪除的一端叫隊頭() * * * ps:還存在一種 雙端佇列 即隊頭和隊尾都可以進行插入和刪除的操作,隊頭和隊尾在這裡叫端點 * 以及輸入受限的雙端佇列(一端輸入和刪除,另一端只能刪除) * 輸出受限的雙端佇列(一端輸入和刪除,另一端只能輸入) * 但是雙端佇列應用不廣泛 不在此做討論 */ public interface IQueue<T> { /** * 初始化佇列 構造一個空佇列 */ IQueue InitQueue(); /** * 銷燬佇列 */ IQueue DestroyQueue(); /** * 清空佇列 */ IQueue ClearQueue(); /** * 佇列判空 */ Boolean isEmpty(); /** * 返回佇列長度 */ Integer QueueLength(); /** * 返回佇列頭元素 */ T GetHead(); /** * 插入隊尾元素 */ Boolean EnQueue(T e); /** * 刪除隊頭元素 即出隊 */ T DeQueue(); }
節點
package Interface; public class LNode<T> { private T data; private LNode next; public LNode() { } public LNode(T data, LNode next) { this.data = data; this.next = next; } public T getData() { return data; } public void setData(T data) { this.data = data; } public LNode getNext() { return next; } public void setNext(LNode next) { this.next = next; } }
連結串列實現
package impl; import Interface.IQueue; import Interface.LNode; import java.util.LinkedList; /** * 鏈佇列 * <p> * 鏈佇列中 需要有隊頭和隊尾指標,且為了表示方便 這裡新增一個頭節點 * 因此鏈佇列判空的條件為 隊頭和隊尾指標均指向頭節點 * 鏈佇列的操作即是單鏈表的插入和刪除操作的特殊情況 * * @param <T> */ public class LinkedQueue<T> implements IQueue { private LNode Header;//頭指標 指向頭節點 即隊首元素的前一個位置 (作用 方便刪除隊首元素,方便判斷佇列是否滿) private LNode TaillPoint;//尾指標 private Integer size; public IQueue InitQueue() { if (Header == null) { Header = new LNode<T>(); //例項化頭節點 //頭尾指標均指向頭節點 TaillPoint = Header; size = 0; } return this; } public IQueue DestroyQueue() { //銷燬 Header = null; TaillPoint = Header; size = 0; return this; } public IQueue ClearQueue() { //頭尾指標均指向頭節點 TaillPoint = Header; size = 0; return this; } public Boolean isEmpty() { if (TaillPoint == Header) { return Boolean.TRUE; } else { return Boolean.FALSE; } } public Integer QueueLength() { return size; } public T GetHead() { return (T) Header.getNext().getData(); } public Boolean EnQueue(Object e) { //入隊 從隊尾入 LNode newNode = new LNode<T>((T) e, null); TaillPoint.setNext(newNode); TaillPoint = newNode; size++; return Boolean.TRUE; } public T DeQueue() { //刪除的時候 如果是最後一個元素, 這個時候尾指標需要調整為指向頭節點。 ps:至始至終 頭節點本身不需要變,但是頭節點指向的next指標要變 if (Header.getNext().getNext()==null ) { T e = (T) Header.getNext().getData(); Header.setNext(null); TaillPoint = Header; return e; } T e = (T) Header.getNext().getData(); Header.setNext(Header.getNext().getNext()); size--; return e; } public static void main(String[] args) { LinkedQueue<Integer> linkedQueue = new LinkedQueue<Integer>(); linkedQueue.InitQueue(); linkedQueue.EnQueue(1); linkedQueue.EnQueue(2); linkedQueue.EnQueue(3); Integer s = linkedQueue.size; System.out.println(linkedQueue.GetHead()); for (Integer integer = 0; integer < s; integer++) { System.out.println(linkedQueue.DeQueue()); } System.out.println(linkedQueue.isEmpty()); } }
輸出結果:
1
1
2
3
true