/** * FixedCircularArrayQueue * realizza il tipo di dati astratto Coda con un array circolare a dimensione * fissa e due indice * @author M. dalpasso modificata da A. Luchetta * @version 20-Nov-2006 * @see FixedArrayQueue */ public class FixedCircularArrayQueue extends FixedArrayQueue { /** incrementa un indice di una posizione, tornando all’inizio dell’array se si supera la fine @param index l'indice da incrementare @return l'indice incrementato */ protected int increment(int index) { return (index + 1) % v.length; } /** inserisce l'elemento all’ultimo posto della coda @param obj nuovo elemento da inserire @throws FullQueueException */ public void enqueue(Object obj) throws FullQueueException { /* l'eccezione viene lanciata quando l'array ha ancora un indice libero (back). Si evita lo stato di array pieno che comporterebbe la condizione front = back, per riservarla allo stato di array vuoto */ if (increment(back) == front) throw new FullQueueException(); v[back] = obj; back = increment(back); } /** rimuove l’elemento al primo posto della coda O(1) @return elemento rimosso @throws EmptyQueueException se la coda e’ vuota */ public Object dequeue() throws EmptyQueueException { Object obj = getFront(); v[front] = null; // garbage collector front = increment(front); return obj; } /** calcola il numero di elementi nel contenitore @return il numero di elementi nel contenitore */ public int size() { return (v.length - front + back) % v.length; } // non serve sovrascrivere getFront() perché non // modifica le variabili back e front }