java迴圈佇列的實現
阿新 • • 發佈:2018-11-27
package impl; import Interface.IQueue; /** * 迴圈佇列 * <p> * 注意:判空和判滿的兩種情況: * 情況1.另設一個標識位區別佇列是空還是滿 * 情況2.少用一個元素空間,約定以"佇列頭指標在隊尾指標的下一位位置上" 作為佇列滿的標誌 * * @param <T> */ public class CycQueue<T> implements IQueue { private Integer MAXSIZE = 6; //迴圈佇列最大長度為7 0~6 private Object[] arr; private Integer front;//頭指標,若佇列不為空,指向隊頭元素 private Integer rear; //尾指標,若佇列不為空,指向佇列尾元素的下一個位置 public IQueue InitQueue() { arr = new Object[MAXSIZE]; front = rear = 0; return this; } public IQueue DestroyQueue() { arr = null; rear = front = 0; return this; } public IQueue ClearQueue() { rear = front = 0; for (int i = 0; i < arr.length; i++) { arr[i] = null; } return this; } public Boolean isEmpty() { if (front == rear) { return Boolean.TRUE; } else { return Boolean.FALSE; } } public Integer QueueLength() { return (rear - front + MAXSIZE) % MAXSIZE; //求環形佇列的元素個數 } public Object GetHead() { return arr[front]; } //入隊前判滿 public Boolean EnQueue(Object e) { //佇列頭指標在隊尾指標的下一位位置上 說明滿了 if ((rear + 1) % MAXSIZE == front) { return Boolean.FALSE; } arr[rear] = e; rear = (rear + 1) % MAXSIZE; return Boolean.TRUE; } //出隊前判空 public Object DeQueue() { if (rear == front) { return null; } T e = (T) arr[front]; front = (front + 1) % MAXSIZE; return e; } public static void main(String[] args) { CycQueue<Integer> cycQueue = new CycQueue<Integer>(); cycQueue.InitQueue(); cycQueue.EnQueue(1); cycQueue.EnQueue(2); cycQueue.EnQueue(3); cycQueue.EnQueue(4); cycQueue.EnQueue(5); cycQueue.EnQueue(6); Integer s = cycQueue.QueueLength(); System.out.println(cycQueue.GetHead()); for (Integer integer = 0; integer < s; integer++) { System.out.println(cycQueue.DeQueue()); } System.out.println(cycQueue.isEmpty()); cycQueue.EnQueue(4); cycQueue.EnQueue(5); cycQueue.EnQueue(6); s = cycQueue.QueueLength(); for (Integer integer = 0; integer < s; integer++) { System.out.println(cycQueue.DeQueue()); } System.out.println(cycQueue.isEmpty()); } }
輸出結果
1
1
2
3
4
5
true
4
5
6
true