自定義連結串列(3):用連結串列的方式實現佇列
阿新 • • 發佈:2019-01-03
通過學習自定義連結串列,瞭解連結串列的資料結構。
本篇以連結串列的方式實現佇列。(參看陣列佇列 ,以及 迴圈佇列)
首先寫一個佇列的介面,描述其具有的基本功能。參看 自定義佇列:Queue.java
然後寫一個介面的實現類,這只是其中一種實現方式。LinkedListQueue.java
最後寫一個測試類,測試自定義佇列的效果。Test.java
LinkedListQueue.java:
package Queue; public class LinkedListQueue <E> implements Queue<E>{ /** * 維護的一個內部類,描述節點資訊 * @author Xiaohua * */ private class Node{ public E e;//資料域 public Node next;//指標域 public Node(E e, Node next) { this.e=e; this.next=next; } public Node(E e) { this(e,null); } public Node() { this(null,null); } @Override public String toString() { return e.toString(); } } private Node head;//指向頭結點 private int size;//連結串列大小 private Node tail;//指向尾節點 /** * 無參建構函式 */ public LinkedListQueue(){ head = null; tail = null; size = 0; } /** * 返回佇列的大小 */ @Override public int getSize() { return size; } /** * 判斷佇列是否為空 */ @Override public boolean isEmpty() { return size==0; } /** * 插入隊尾 */ @Override public void enqueue(E e) { if(tail==null) {//此時為空 tail=new Node(e); head=tail; } else { tail.next =new Node(e); tail=tail.next; } size++; } /** * 取出隊頭 */ @Override public E dequeue() { if(isEmpty()) { throw new IllegalArgumentException("空佇列,無法取出隊頭元素"); } Node retNode = head; head = head.next; retNode.next = null; if(head == null) tail = null; size --; return retNode.e; } /** * 檢視隊頭 */ @Override public E getFront() { if(isEmpty()) { throw new IllegalArgumentException("空佇列,無法檢視隊頭元素"); } return head.e; } /** * 重寫Object的toString方法 */ @Override public String toString() { StringBuilder res = new StringBuilder(); res.append("Queue: front "); Node cur = head; while(cur != null) { res.append(cur + "->"); cur = cur.next; } res.append("NULL tail"); return res.toString(); } }
Test.java:
package Queue; public class Test { public static void main(String[] args) { Queue<Integer> queue=new LinkedListQueue<Integer>(); for(int i=0;i<10;i++) { queue.enqueue(i); System.out.println(queue); if(i%3==2) {//每插入3個,則取出隊頭元素。 queue.dequeue(); System.out.println(queue); } } } }
控制檯輸出;