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