/** 
 * 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(); 
} 
 
    
     
     
     
     
     
     
  
  |