Mega Code Archive

 
Categories / Java / Collections Data Structure
 

This class implements the data structures necessary for an ArrayQueue

/**  * This class implements the data structures necessary for an ArrayQueue which throws  * proper exceptions and is expandable when the queue fills up.  Much of the code below  * is adapted from code on pages 194-195, 205-208 of Data Structures & Algorithms in Java by  * Michael T. Goodrich and Roberto Tamassia.   *   * @author Alex Laird  * @version 1.0  * File: ArrayQueue.java  * Created: Oct 2008  *  * @param <E> defines the generics for the queue  */ public class ArrayQueue<E> implements Queue<E> {   public static final int  CAPACITY = 1000;  // default queue capacity   protected int  capacity;  // current queue capacity   protected int  front;  // index of the first element in queue   protected int  next;  // index of the next available array cell in queue   protected E[]  genArray;  // generic array used to implement the queue      /**    * Default constructor.  Passes the default capacity for the array if one is not specified.    */   public ArrayQueue()   {     this(CAPACITY);   }      /**    * A constructor which will define the  generic array used to implement the queue and set it's size.    *     * @param cap    */   public ArrayQueue(int cap)   {     capacity = cap + 1;     genArray = (E[]) new Object[capacity];          front = next = 0;   }      /**    * Inserts an element at the rear of the queue.    *     * @param element the element to be inserted    */   public void enqueue(E element)   {     // check to see if array capacity has been reached     if(size() == capacity - 1)     {       int  newSize = capacity * 2;              // expand the array       E[] newArray = (E[]) new Object[newSize];              for(int i = 0, j = front; i < size(); i++)       {                 newArray[i] = genArray[j];                  j = (++j)%capacity;       }              // in case of wrap-around, assign front and next properly       front = 0;       next = capacity - 1;              // set old array pointer to new array       capacity = newSize;       genArray = newArray;     }          // insert element, increment next pointer (wrap-around supported)     genArray[next] = element;     next = (++next)%capacity;   }   /**    * Removes the element at the rear of the queue.    *     * @throws QueueEmptyException if the queue is empty    * @return the removed element    */   public E dequeue() throws Exception   {     E element;          if(isEmpty())       throw new Exception("Queue is empty.");          // remove element, null and increment front pointer (wrap-around supported)     element = genArray[front];     genArray[front] = null;     front = (++front)%capacity;          return element;   }      /**    * Returns, but does not remove, the front element of the queue.    *     * @throws QueueEmptyException if the queue is empty    * @return the front element of the queue    */   public E front() throws Exception   {     if(isEmpty())       throw new Exception("Queue is empty.");          return genArray[front];   }      /**    * Returns the current number of elements in the queue.    *     * @return the number of elements in the queue    */   public int size()   {     // return the size, wrap-around supported     return(capacity - front + next)%capacity;   }      /**    * Checks to see if the queue is empty.    *     * @return true of false, depending on whether the queue is empty or not    */   public boolean isEmpty()   {     return(front == next);   }      /**    * Will set all values of an array to null    *     * @param array is the array who's values are to be set to null    * @return the array with each value set to null    */   public static Object[] nullArray(Object[] array)   {     for(int i = 0; i < array.length; i++)     {       array[i] = null;     }          return array;   }      /**    * The main method from which the program executes; it handles all testing and exception handling.    *     * @param args unused    */   public static void main(String[] args) throws Exception   {     Object[] check = new Object[15];     Object[] answers = new Object[15];     boolean  pass = false;          /*      *  Test #1:  Compliance with Integer      */          System.out.println("Test #1:  Check to see if queue works properly with Integer objects.");          ArrayQueue<Integer> iQueue = new ArrayQueue<Integer>();          // valid output for test     answers[0] = 1;     answers[1] = 2;     answers[2] = 3;     answers[3] = 4;     answers[4] = 5;          // run test     iQueue.enqueue(1);     iQueue.enqueue(2);     iQueue.enqueue(3);     iQueue.enqueue(4);     iQueue.enqueue(5);     check[0] = iQueue.dequeue();     check[1] = iQueue.dequeue();     check[2] = iQueue.dequeue();     check[3] = iQueue.dequeue();     check[4] = iQueue.dequeue();          // check test against valid output     for(int i = 0; i < 5; i++)     {       if(check[i] == answers[i])       {         pass = true;       }       else       {         pass = false;                  break;       }     }          // display result     if(pass == true)       System.out.println("PASSED!\n");           else       System.out.println("FAILED!\n");          /*      * Test #2:  Compliance with String      */     System.out.println("Test #2:  Check to see if queue works properly with String objects.");          pass = false;     check = nullArray(check);     answers = nullArray(answers);     ArrayQueue<String> sQueue = new ArrayQueue<String>();          // valid output     answers[0] = "A";     answers[1] = "B";     answers[2] = "C";     answers[3] = "D";     answers[4] = "E";          // run test     sQueue.enqueue("A");     sQueue.enqueue("B");     sQueue.enqueue("C");     sQueue.enqueue("D");     sQueue.enqueue("E");         check[0] = sQueue.dequeue();     check[1] = sQueue.dequeue();         check[2] = sQueue.dequeue();         check[3] = sQueue.dequeue();         check[4] = sQueue.dequeue();          // check test against valid output     for(int i = 0; i < 5; i++)     {       if(check[i].equals(answers[i]))       {         pass = true;       }       else       {         pass = false;                  break;       }     }          // display result     if(pass == true)       System.out.println("PASSED!\n");           else       System.out.println("FAILED!\n");          /*      * Test #3:  Compliance with generic Object      */     System.out.println("Test #3:  Check to see if queue works properly with generic Objects.");          pass = false;     check = nullArray(check);     answers = nullArray(answers);     ArrayQueue<Object> oQueue = new ArrayQueue<Object>();          // valid output     answers[0] = 1;     answers[1] = 2;     answers[2] = "A";     answers[3] = 3;     answers[4] = null;          // run test     oQueue.enqueue(1);     oQueue.enqueue(2);     oQueue.enqueue("A");     oQueue.enqueue(3);     oQueue.enqueue(null);         check[0] = oQueue.dequeue();     check[1] = oQueue.dequeue();     check[2] = oQueue.dequeue();     check[3] = oQueue.dequeue();     check[4] = oQueue.dequeue();          // check test against valid output     for(int i = 0; i < 5; i++)     {       try       {         if(check[i].equals(answers[i]))         {           pass = true;         }         else         {           pass = false;                      break;         }       }       catch(NullPointerException c)       {         if(check[i] == answers[i])         {           pass = true;         }         else         {           pass = false;                      break;         }       }     }          // display result     if(pass == true)       System.out.println("PASSED!\n");           else       System.out.println("FAILED!\n");          /*      * Test #4:  Wrap-around test      */     System.out.println("Test #4:  Create a queue sized five; load and unload elements to cause wrap-around.");          pass = false;     check = nullArray(check);     answers = nullArray(answers);     ArrayQueue<Integer> wrapQueue = new ArrayQueue<Integer>(5);          // valid output     answers[0] = 1;     answers[1] = 2;     answers[2] = 3;     answers[3] = 4;     answers[4] = 5;     answers[5] = 6;     answers[6] = 7;     answers[7] = 8;          // run test     wrapQueue.enqueue(1);     wrapQueue.enqueue(2);     wrapQueue.enqueue(3);     check[0] = wrapQueue.dequeue();     check[1] = wrapQueue.dequeue();     wrapQueue.enqueue(4);     wrapQueue.enqueue(5);     wrapQueue.enqueue(6);     check[2] = wrapQueue.dequeue();     check[3] = wrapQueue.dequeue();     check[4] = wrapQueue.dequeue();     check[5] = wrapQueue.dequeue();     wrapQueue.enqueue(7);     wrapQueue.enqueue(8);     check[6] = wrapQueue.dequeue();     check[7] = wrapQueue.dequeue();          // check test against valid output     for(int i = 0; i < 8; i++)     {       if(check[i] == answers[i])       {         pass = true;       }       else       {         pass = false;                  break;       }     }          // display result     if(pass == true)       System.out.println("PASSED!\n");           else       System.out.println("FAILED!\n");          /*      * Test #5:  Test for simple resize      */     System.out.println("Test #5:  Create a queue sized to five; load the queue with more than five to resize.");          pass = false;     check = nullArray(check);     answers = nullArray(answers);     ArrayQueue<Integer> simpleResizeQueue = new ArrayQueue<Integer>(5);          // valid output     answers[0] = 5;     answers[1] = 10;     answers[2] = 15;     answers[3] = 20;     answers[4] = 25;     answers[5] = 30;     answers[6] = 35;     answers[7] = 40;     answers[8] = 45;     answers[9] = 50;          // run test     simpleResizeQueue.enqueue(5);     simpleResizeQueue.enqueue(10);     simpleResizeQueue.enqueue(15);     simpleResizeQueue.enqueue(20);     simpleResizeQueue.enqueue(25);     simpleResizeQueue.enqueue(30);     simpleResizeQueue.enqueue(35);     simpleResizeQueue.enqueue(40);     simpleResizeQueue.enqueue(45);     simpleResizeQueue.enqueue(50);     check[0] = simpleResizeQueue.dequeue();     check[1] = simpleResizeQueue.dequeue();     check[2] = simpleResizeQueue.dequeue();     check[3] = simpleResizeQueue.dequeue();     check[4] = simpleResizeQueue.dequeue();     check[5] = simpleResizeQueue.dequeue();     check[6] = simpleResizeQueue.dequeue();     check[7] = simpleResizeQueue.dequeue();     check[8] = simpleResizeQueue.dequeue();     check[9] = simpleResizeQueue.dequeue();          // check test against valid output     for(int i = 0; i < 10; i++)     {       if(check[i] == answers[i])       {         pass = true;       }       else       {         pass = false;                  break;       }     }          // display result     if(pass == true)       System.out.println("PASSED!\n");           else       System.out.println("FAILED!\n");          /*      * Test #6:  Test for complex resize      */     System.out.println("Test #6:  Create a queue sized to ten; load and unload the queue to cause wrap-around; load ");      System.out.println("the queue with more than ten items to resize with wrap-around.");          pass = false;     check = nullArray(check);     answers = nullArray(answers);     ArrayQueue<Integer> complexResizeQueue = new ArrayQueue<Integer>(10);     // valid output     answers[0] = 1;     answers[1] = 2;     answers[2] = 3;     answers[3] = 4;     answers[4] = 5;     answers[5] = 6;     answers[6] = 7;     answers[7] = 8;     answers[8] = 9;     answers[9] = 10;     answers[10] = 11;     answers[11] = 12;     answers[12] = 13;     answers[13] = 14;     answers[14] = 15;          // run test     complexResizeQueue.enqueue(1);     complexResizeQueue.enqueue(2);     complexResizeQueue.enqueue(3);     complexResizeQueue.enqueue(4);     check[0] = complexResizeQueue.dequeue();     check[1] = complexResizeQueue.dequeue();       complexResizeQueue.enqueue(5);     complexResizeQueue.enqueue(6);     complexResizeQueue.enqueue(7);     check[2] = complexResizeQueue.dequeue();     check[3] = complexResizeQueue.dequeue();     complexResizeQueue.enqueue(8);     complexResizeQueue.enqueue(9);     complexResizeQueue.enqueue(10);     complexResizeQueue.enqueue(11);     complexResizeQueue.enqueue(12);     complexResizeQueue.enqueue(13);     complexResizeQueue.enqueue(14);     complexResizeQueue.enqueue(15);     check[4] = complexResizeQueue.dequeue();     check[5] = complexResizeQueue.dequeue();     check[6] = complexResizeQueue.dequeue();     check[7] = complexResizeQueue.dequeue();     check[8] = complexResizeQueue.dequeue();     check[9] = complexResizeQueue.dequeue();     check[10] = complexResizeQueue.dequeue();     check[11] = complexResizeQueue.dequeue();     check[12] = complexResizeQueue.dequeue();     check[13] = complexResizeQueue.dequeue();     check[14] = complexResizeQueue.dequeue();          // check test against valid output     for(int i = 0; i < 15; i++)     {       if(check[i] == answers[i])       {         pass = true;       }       else       {         pass = false;                  break;       }     }          // display result     if(pass == true)       System.out.println("PASSED!\n");           else       System.out.println("FAILED!\n");          /*      * Test #7:  Test for front check when queue is empty      */     System.out.println("Test #7:  Check front element before anything is stored there to throw QueueEmptyException.");          pass = false;     check = nullArray(check);     answers = nullArray(answers);     ArrayQueue<Double> frontQueue = new ArrayQueue<Double>();          // run test     try     {       frontQueue.front();     }     catch(Exception c)     {       System.out.println("The queue was empty when the front item was called.");              pass = true;     }     finally     {       if(pass == true)       {         System.out.println("PASSED!\n");       }       else       {         System.out.println("FAILED!\n");       }     }          /*      * Test #8:  Test for QueueEmptyException after input      */     System.out.println("Test #8:  Load the queue with values; remove all elements plus one to throw QueueEmptyException.");          pass = false;     check = nullArray(check);     answers = nullArray(answers);     ArrayQueue<Double> queueEmptyQueue = new ArrayQueue<Double>();          // run test     try     {       queueEmptyQueue.enqueue(23.0);       queueEmptyQueue.enqueue(17.77);       queueEmptyQueue.enqueue(15.5);       check[0] = queueEmptyQueue.dequeue();       check[1] = queueEmptyQueue.dequeue();       check[2] = queueEmptyQueue.dequeue();       check[3] = queueEmptyQueue.dequeue();     }     catch(Exception c)     {       System.out.println("The queue was empty when the front item was called.");              pass = true;     }     finally     {       if(pass == true)       {         System.out.println("PASSED!\n");       }       else       {         System.out.println("FAILED!\n");       }     }   } } /**  * The interface for a generic queue.  *   * @author Alex Laird  * @version 1.0  * File: Queue.java  * Created: Oct 2008  *  * @param <E> defines the generics for the queue  */ interface Queue<E> {   public void enqueue(E element);   public E dequeue() throws Exception;   public E front() throws Exception;   public int size();   public boolean isEmpty(); }