Java數據結構與算法(3):隊列

隊列也是一種表,不一樣的是隊列在一端進行插入而在另外一端進行刪除。數組

隊列模型

隊列的基本操做包括入隊、出隊操做。在表的末端插入元素,在表的開頭刪除元素,即先進先出(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;
    }
}
相關文章
相關標籤/搜索