001: import java.util.*;
002:
003: /**
004: A first-in, first-out bounded collection of objects.
005: */
006: public class Queue extends AbstractCollection
007: {
008: /**
009: Constructs an empty queue.
010: @param capacity the maximum capacity of the queue
011: @precondition capacity > 0
012: */
013: public Queue(int capacity)
014: {
015: elements = new Object[capacity];
016: count = 0;
017: head = 0;
018: tail = 0;
019: }
020:
021: public Iterator iterator()
022: {
023: return new
024: Iterator()
025: {
026: public boolean hasNext()
027: {
028: return visited < count;
029: }
030:
031: public Object next()
032: {
033: int index = (head + visited) % elements.length;
034: Object r = elements[index];
035: visited++;
036: return r;
037: }
038:
039: public void remove()
040: {
041: throw new UnsupportedOperationException();
042: }
043:
044: private int visited = 0;
045: };
046: }
047:
048: /**
049: Remove object at head.
050: @return the object that has been removed from the queue
051: @precondition size() > 0
052: */
053: public Object removeFirst()
054: {
055: Object r = elements[head];
056: head = (head + 1) % elements.length;
057: count--;
058: return r;
059: }
060:
061: /**
062: Append an object at tail.
063: @param anObject the object to be appended
064: @return true since this operation modifies the queue.
065: (This is a requirement of the collections framework.)
066: @precondition !isFull()
067: */
068: public boolean add(Object anObject)
069: {
070: elements[tail] = anObject;
071: tail = (tail + 1) % elements.length;
072: count++;
073: return true;
074: }
075:
076: public int size()
077: {
078: return count;
079: }
080:
081: /**
082: Checks whether this queue is full.
083: @return true if the queue is full
084: */
085: public boolean isFull()
086: {
087: return count == elements.length;
088: }
089:
090: /**
091: Gets object at head.
092: @return the object that is at the head of the queue
093: @precondition size() > 0
094: */
095: public Object getFirst()
096: {
097: return elements[head];
098: }
099:
100: private Object[] elements;
101: private int head;
102: private int tail;
103: private int count;
104: }