隊列也是一種表,不一樣的是隊列在一端進行插入而在另外一端進行刪除。數組
隊列的基本操做包括入隊、出隊操做。在表的末端插入元素,在表的開頭刪除元素,即先進先出(FIFO)。數據結構
對於每個隊列數據結構,保留一個數組items以及位置front和back,分別表示隊列的兩端,還要記錄元素的個數size。操做過程應該是:當一個元素x入隊,size和back增1,置items[back]=x;出隊時,返回items[front],size減1,而後front增1。this
初始隊列:
3d
入隊:
code
出隊:
blog
因爲數組是有邊界的,上述過程重複屢次後,可能出現back已是數組的最後一個下標了,而數組中通過屢次出隊操做可能剩下不多甚至沒有元素了,解決方式是只有front或back到達數組的尾端,它就又繞回到開頭,這叫作循環數組實現。
初始狀態:
隊列
1次入隊後:
it
2次入隊後:
io
1次出隊後:
class
2次出隊後:
3次出隊後:
4次出隊後:
關於隊列,最終的就是入隊和出隊操做,這裏使用隊首和隊尾與數組長度的關係判斷隊列是否爲空、是否已滿:
public class MyArrayQueue<T> { private int front; private int back; private T[] items; private static final int DEFAULT_CAPACITY = 10; public MyArrayQueue() { this(DEFAULT_CAPACITY); } public MyArrayQueue(int size) { front = back = 0; items = (T[]) new Object[size]; } public boolean isEmpty() { return front == back; } public void enqueue(T x) throws Exception { if ((back + 1) % items.length == front) { throw new Exception("隊列已滿"); } items[back] = x; back = back % items.length + 1; } public T dequeue() throws Exception { if (back % items.length == front) { throw new Exception("隊列爲空"); } T x = items[front]; front = front % items.length + 1; return x; } }