public class ArrayQueue<E> implements Queue<E> {

	// Data Members
	private E[] stuff;
	
	private int size;
	private int front;
	
	// Constructor
	public ArrayQueue() {
		// allocation
		stuff = (E[])(new Object[1]);
	}

	// Methods
	public boolean isEmpty() {
		return size == 0;
	}

	public E remove() {
		if (! isEmpty()) {
			E temp = stuff[front];
			front = (front + 1) % stuff.length;
			size--;
			return temp;
		}
		return null;
	}
	
	protected boolean isFull() {
		return size == stuff.length;
	}
	
	protected void resize() {
		E[] mystuff = (E[])(new Object[stuff.length * 2]);
		for (int i = 0; i < size; i++) {
			mystuff[i] = stuff[(i + front ) % stuff.length];
		}
		stuff = mystuff;
		front = 0;
	}
	
	public void add(E target) {
		if (isFull()) {
			resize();
		}
		stuff[(size + front) % stuff.length] = target;
		size++;
	}

	public String toString() {
		String s = "{";
		for (int i = front; i < size + front; i++) {
			s += stuff[i % stuff.length] + " ";
		}
		return s + "}";
	
	}
}