// ARRAY QUEUE. A fixed length queue implemented as a circular array.
class ArrayQueue {
private int front; // Index of front object in OBJECTS.
private int rear; // Index obf rear object in OBJECTS.
private Base[] objects; // The objects in the queue.
public class Iterator {
private ArrayQueue parent;
private int position;
public Iterator(ArrayQueue parent) {
this.parent = parent;
this.position = 0;
}
public boolean hasNext() {
int _rear = parent.rear - parent.front;
if (_rear < 0) _rear += parent.objects.length;
return this.position < _rear;
}
public Base next() {
return parent.objects[(parent.front + ++this.position) % parent.objects.length];
}
}
public Iterator iterator() {
return new Iterator(this);
}
// Constructor. Make a new empty queue that can hold SIZE - 1 elements.
public ArrayQueue(int size) {
if (size >= 1) {
front = 0;
rear = 0;
objects = (Base[]) new Object[size];
} else {
throw new IllegalArgumentException("Size must be at least one.");
}
}
// IS EMPTY. Test if the queue is empty.
public boolean isEmpty() {
return front == rear;
}
// IS FULL. Test if the queue can hold no more elements.
public boolean isFull() {
return front == (rear + 1) % objects.length;
}
// ENQUEUE. Add OBJECT to the rear of the queue.
public void enqueue(Base object) {
int nextRear = (rear + 1) % objects.length;
if (front == nextRear) {
throw new IllegalStateException("Queue is full.");
} else {
rear = nextRear;
objects[rear] = object;
}
}
// DEQUEUE. Remove an object from the front of the queue and return it.
public Base dequeue() {
if (isEmpty()) {
throw new IllegalStateException("Queue is empty.");
} else {
front = (front + 1) % objects.length;
Base temp = objects[front];
objects[front] = null;
return temp;
}
}
}
class lab10 {
// MAIN. Start execution here.
public static void main(String[] args) {
// Make an ARRAY QUEUE and enqueue some things.
ArrayQueue queue = new ArrayQueue(5);
queue.enqueue("A");
queue.enqueue("B");
queue.enqueue("C");
// Make an ITERATOR for QUEUE.
ArrayQueue.Iterator first = queue.iterator();
while (first.hasNext()) {
System.out.println(first.next()); // Print A B C, one per line.
}
// The iterator hasn’t changed QUEUE!.
System.out.println(queue.isEmpty()); // Print false
System.out.println(queue.dequeue()); // Print A
System.out.println(queue.dequeue()); // Print B
System.out.println(queue.dequeue()); // Print C
System.out.println(queue.isEmpty()); // Print true
// Let’s enqueue more things to QUEUE.
queue.enqueue("X");
queue.enqueue("Y");
queue.enqueue("Z");
// Now make a SECOND ITERATOR for QUEUE. The FIRST one won’t work any more.
ArrayQueue.Iterator second = queue.iterator();
while (second.hasNext()) {
System.out.println(second.next()); // Print X Y Z, one per line.
}
// The SECOND iterator hasn’t changed QUEUE either!
System.out.println(queue.isEmpty()); // Print false
System.out.println(queue.dequeue()); // Print X
System.out.println(queue.dequeue()); // Print Y
System.out.println(queue.dequeue()); // Print Z
System.out.println(queue.isEmpty()); // Print true
}
}