// Implementation of a circular queue // Uses an ArrayList since we can't create an // array of generic type. The size of the ArrayList doesn't change // // d. frey july 2011 import java.util.*; public class CircularQueue { private int head, tail, size, nrElements; private ArrayList elements; public CircularQueue( int maxSize ) { // add(null) initializes contents of elements // so that set( ) may be used to enqueue elements = new ArrayList (maxSize); for( int i = 0; i < maxSize; i++) elements.add( null ); size = maxSize; makeEmpty( ); } // make the queue logically empty public void makeEmpty( ) { head = 0; tail = -1; nrElements = 0; } public boolean isEmpty( ) { return nrElements == 0; } public boolean isFull( ) { return nrElements == size; } public boolean enqueue( T x ) { if (isFull()) return false; tail = ++tail % size; elements.set( tail, x); ++nrElements; return true; } public T dequeue( ) { if (isEmpty()) return null; T item = elements.get( head ); head = ++head % size; --nrElements; return item; } public void print( ) { System.out.println( "size = " + size); System.out.println( "nrElements = " + nrElements); System.out.println( "head = " + head); System.out.println( "tail = " + tail); for( int i = 0; i < size; i++) System.out.println( elements.get(i)); } public static void main( String args[]) { CircularQueue q = new CircularQueue( 6 ); q.print( ); System.out.println("in 11"); q.enqueue(11); q.print( ); System.out.println("in 12"); q.enqueue(12); q.print( ); System.out.println("in 13"); q.enqueue(13); q.print( ); System.out.println("in 14"); q.enqueue(14); q.print( ); Integer x; System.out.println("dq 11"); x = q.dequeue(); q.print( ); System.out.println("dq 12"); x = q.dequeue(); q.print( ); System.out.println("in 15"); q.enqueue( 15); q.print( ); System.out.println("in 16"); q.enqueue(16); q.print(); } };