128 lines
No EOL
3.3 KiB
Java
128 lines
No EOL
3.3 KiB
Java
// ARRAY QUEUE. A fixed length queue implemented as a circular array.
|
||
|
||
class ArrayQueue <Base> {
|
||
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<Base> parent;
|
||
private int position;
|
||
public Iterator(ArrayQueue<Base> 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<String> queue = new ArrayQueue<String>(5);
|
||
queue.enqueue("A");
|
||
queue.enqueue("B");
|
||
queue.enqueue("C");
|
||
|
||
// Make an ITERATOR for QUEUE.
|
||
|
||
ArrayQueue<String>.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<String>.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
|
||
}
|
||
} |