/** Returns but does not remove an entry with minimum key. */
public Entry min() throws EmptyPriorityQueueException {
if (isEmpty())
throw new EmptyPriorityQueueException("Priority queue is empty");
return entry(T.root());
}
/** Inserts a key-value pair and return the entry created. */
public Entry insert(Object k, Object x) throws InvalidKeyException {
checkKey(k); // may throw an InvalidKeyException
Entry entry = new MyEntry(k,x);
upHeap(T.add(entry));
return entry;
}
/** Removes and returns an entry with minimum key. */
public Entry removeMin() throws EmptyPriorityQueueException {
if (isEmpty())
throw new EmptyPriorityQueueException("Priority queue is empty");
Entry min = entry(T.root());
if (size() == 1)
T.remove();
else {
T.replace(T.root(), T.remove());
downHeap(T.root());
}
return min;
}
/** Returns the entry stored at a heap node. */
protected Entry entry (Position p) {
return (Entry) p.element();
}
/** Returns the key stored at a heap node. */
protected Object key (Position p) {
return ((Entry) p.element()).key();
}
/** Determines whether a given key is valid. */
protected void checkKey(Object key) throws InvalidKeyException {
try {
comp.compare(key,key);
}
catch(Exception e) {
throw new InvalidKeyException("Invalid key");
}
}