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: }