public class Queue {
    Object[] array;
    int first, next;

    public Queue () {
	array = new Object[128];
	first = 0;
	next = 0;
    }

    public boolean empty () {
	return first == next;
    }

    public void insert (Object obj) {
	if (full ()) resize ();

	array[next] = obj;
	next = (next+1) % array.length;
    }

    public Object remove () {
	Object result = array[first];
	first = (first+1) % array.length;
	return result;
    }

    private boolean full () {
	return (next+1) % array.length == first;
    }

    private void resize () {
	Object[] newArray = new Object [2 * array.length];
	int i;
	for (i=0; !empty (); i++) {
	    newArray[i] = remove ();
	}
	array = newArray;
	first = 0;
	next = i;
    }
}
