/**
 * The Queue interface and some Queue implementations.
 * 
 * @author Paul Chew for CS211, Oct 2006
 */

public interface Queue {
    public void enQueue (Object x);
    public Object deQueue ();
    public Object peek ();
    public boolean isEmpty ();
    public void makeEmpty ();
}

class ListQueue implements Queue {
    
    private Node head, last;          // Head and last nodes of queue
    
    public void enQueue (Object x) {
        if (head == null) head = last = new Node(x, null);
        else {last.next = new Node(x, null); last = last.next;}
    }
    public Object deQueue () {
        Node temp = head; head = head.next; return temp.data;}
    public Object peek () {return head.data;}
    public boolean isEmpty () {return head == null;}
    public void makeEmpty () {head = null;}
}

class ArrayQueue implements Queue {
    
    private Object[] array;           // Holds the queue (head at 0)
    private int last;                 // Index of last item in queue
    
    public ArrayQueue (int maxSize) {array = new Object[maxSize]; last = -1;}
    public void enQueue (Object x) {array[++last] = x;}
    public Object deQueue () {
        Object temp = array[0];       // Invalid if queue is empty
        for (int i = 1; i < array.length; i++) {array[i-1] = array[i];}
        last = last - 1; return temp;
    }
    public Object peek () {return array[0];} // Invalid if queue is empty
    public boolean isEmpty () {return last == -1;}
    public void makeEmpty () {last = -1;}
}