public class SortedSequencePriorityQueue implements PriorityQueue {
protected Sequence S = new NodeSequence();
protected Comparator comp;
protected Object key (Position pos) {
return ((Item) pos.element()).key();
}
protected Object elem (Position pos) {
return ((Item) pos.element()).element();
}
protected Object elem (Object kep) {
return ((Item) kep).element();
}
public SortedSequencePriorityQueue (Comparator c) { comp = c; }
public int size () {return S.size(); }
public boolean isEmpty () { return S.isEmpty(); }
public void insertItem (Object k, Object e) throws InvalidKeyException {
if (!comp.isComparable(k))
throw new InvalidKeyException("The key is not valid");
else if (S.isEmpty())
S.insertFirst(new Item(k, e));
else if (comp.isGreaterThan(k, key(S.last())))
S.insertAfter(S.last(),new Item(k,e));
else {
Position curr = S.first();
while (comp.isGreaterThan(k, key(curr)))
curr = S.after(curr);
S.insertBefore(curr,new Item(k,e));
}
}
public Object removeMin() throws PriorityQueueEmptyException {
if (S.isEmpty())
throw new EmptyContainerException("The priority queue is empty");
else
return elem(S.remove(S.first()));
}