class SortedPriorityQueue(PriorityQueueBase): """A min-oriented priority queue implemented with a sorted list.""" def __init__(self): """Create a new empty Priority Queue.""" self._data = PositionalList() def __len__(self): """Return the number of items in the priority queue.""" return len(self._data) def add(self, key, value): """Add a key-value pair.""" newest = self._Item(key, value) walk = self._data.last() # walk backward looking for smaller key while walk is not None and newest < walk.element(): walk = self._data.before(walk) if walk is None: self._data.add_first(newest) # new key is the smallest else: self._data.add_after(walk, newest) # newest goes after walk def min(self): """Return but do not remove (k, v) tuple with minimum key.""" if self.is_empty(): raise Empty('Priority queue is empty.') p = self._data.first() item = p.element() return (item._key, item._value) def remove_min(self): """Remove and return (k, v) tuple with minimum key from the priority queue.""" if self.is_empty(): raise Empty('Priority queue is empty.') item = self._data.delete(self._data.first()) return (item._key, item._value)
def test_before_returns_None_with_passed_first_Position_in_list(self): pl = PositionalList() # create two nodes with proper references in the container: n1 = PositionalList._Node('foo', pl._header, pl._trailer) n2 = PositionalList._Node('bar', n1, pl._trailer) n1._next = n2 pl._header._next = n1 pl._trailer._prev = n2 # # create a position for each respective node: p1 = PositionalList.Position(pl, n1) result = pl.before(p1) self.assertIsNone(result)