在實現Queue的API的時候,可以使用兩個實例變量做索引,一個變量head指向隊列的開頭,另一個變量tail指向隊列的結尾.在刪除一個元素的時候,使用head訪問,並將head+1,插入一個元素的時候,使用tail保存它,並將tail加1.如果某個索引增加到超過了數組的邊界的時候,則將它重置為0.下面是隊列的數組實現,除了對於頭元素和尾元素的基本操作以外,其余基本和堆棧相同.
import java.util.Iterator; //編寫一個類ResizingArrayQueueOfStrings使用定長數組實現隊列的抽象, //然后擴展實現,使用調整數組的方法突破數組大小的限制 public class ResizingArrayQueueOfStrings<Item> implements Iterable<Item> { private Item[] a=(Item[])new Object[1]; int head=0; //指向隊列的開頭的索引 int tail=0; //指向隊列的結尾的索引 int N; //數組中裝填的元素數量 public boolean isEmpty() { return N==0; } public int size() { return N; } public void add(Item item) { if(N==a.length) resize(a.length*2);//N增加至數組容量的時候,動態擴展數組的大小 a[tail++]=item; //從tail(尾部)索引處獲取元素. if(tail==a.length) tail=0; //如果tail索引增加到了數組的長度,那么重新置0 N++; //增加N. } public Item remove() { Item item=a[head]; //從隊列頭移除元素 a[head++]=null; //將隊列頭的元素設為null,避免對象游離 N--; //將N減一 if(head==a.length) head=0; //如果head索引增加到了數組的長度,重新置0 if(N<a.length/4) resize(a.length/2); return item; //返回隊列頭部的元素. } public void resize(int n) /*動態調整數組大小的方法*/{ //將數組引用指向一個更大的數組 Item[] items=(Item[])new Object[n]; for(int i=0;i<N;i++) { items[i]=a[(i+head)%a.length]; //從頭元素開始賦值給新的元素. } a=items; //將頭元素和尾部元素分別置位. head=0; tail=N; } @Override public Iterator<Item> iterator() { return new QueueIterator(); } class QueueIterator implements Iterator<Item> { int i=0; @Override public boolean hasNext() { return i<N; } @Override public Item next() { Item item=a[(i+head)%a.length]; //從頭元素開始獲取元素. i++; return item; } } }
