public class QueueArray {

    private static final int MAX=100;   // dimensione massima della coda
    private Object[] Q;                 // la coda
    private int head;                   // puntatore al primo elemento in coda
    private int tail;                   // puntatore all'ultimo elemento della coda


    // post: costruisce una coda vuota
    public QueueArray() {
        Q = new Object[MAX];
        head = 0;
        tail = 0;
    }


    // post: ritorna il numero di elementi nella coda
    public int size() {
	return tail - head;
    }



    // post: ritorna true sse la coda e' vuota
    public boolean isEmpty() {
        return (head  == tail);
    }
  
    // post: ritorna true sse la coda e' piena
    public boolean isFull() {
        return (tail - head == MAX);
    }

    // post: svuota la coda
    public void clear() {
        head = 0;
        tail = 0;
    }
 

    // pre: coda non vuota
    // post: ritorna il valore del primo elemento della coda
    public Object front() {
        return Q[head % MAX];
    }


    // pre: value non nullo
    // post: inserisce value in coda
    public void enqueue(Object ob) {
        
        if (isFull()) 
           return;
	
        Q[tail % MAX] = ob;
        tail = tail + 1;
        if (head > MAX) {
            tail = tail - MAX;
            head = head - MAX;
        }
    }


    // pre: coda non vuota
    // post: ritorna e rimuove l'elemento il primo elemento in coda
    public Object dequeue() {
        Object temp = Q[head % MAX];
        head = (head + 1);
        return temp;
    }
}


