class SortedPriorityQueue(PriorityQueueBase): def __init__(self): self._data = PositionalList() def __len__(self): return len(self._data) def add(self, k, v): newest = self._Item(k, v) walk = self._data.last() while walk is not None and walk.element() > newest: walk = self._data.before(walk) if walk is None: self._data.add_first(newest) else: self._data.add_after(walk, newest) def min(self): if self.is_empty(): raise ValueError('Priority queue is empty') item = self._data.first().element() return (item._key, item._value) def remove_min(self): if self.is_empty(): raise ValueError('Priority queue is empty') item = self._data.delete(self._data.first()) return (item._key, item._value)
class UnsortedPriorityQueue(PriorityQueueBase): def __init__(self): self._data = PositionalList() def __len__(self): return len(self._data) def add(self, k, v): self._data.add_last(self._Item(k, v)) def min(self): item = self._find_min().element() return (item._key, item._value) def remove_min(self): p = self._find_min() item = self._data.delete(p) return (item._key, item._value) def _find_min(self): if self.is_empty(): raise ValueError('Priority queue is empty') small = self._data.first() walk = self._data.after(small) while walk is not None: if walk.element() < small.element(): small = walk walk = self._data.after(walk) return small