circular array queue 基于循环数组的队列

public interface Queue<E> {
    int size();
    boolean isEmpty();
    void enqueue(E e);
    E dequeue();
    E first();
}
public class ArrayQueue<E> implements Queue<E> {
    public static final int CAPACITY = 100;
    private int size;
    private int firstIndex;
    private E[] data;

    public ArrayQueue(int capacity) {
        data = (E[]) new Object[capacity];
        size = 0;
        firstIndex = 0;
    }
    @Override
    public int size() { return size; }
    @Override
    public boolean isEmpty() { return (size == 0); }
    @Override
    public void enqueue(E e) throws IllegalStateException {
        if (size == data.length) throw new IllegalStateException("Queue is full");
        int index = (firstIndex + size) % data.length;
        data[index] = e;
        size++;
    }
    @Override
    public E dequeue() {
        if (size == 0) return null;
        E temp = data[firstIndex];
        data[firstIndex] = null;
        firstIndex = (firstIndex + 1) % data.length;
        size--;
        return temp;
    }

    @Override
    public E first() {
        if (size == 0) return null;
        return data[firstIndex];
    }
}