queue.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import collections
  2. import heapq
  3. class QueueFIFO:
  4. """
  5. Class: QueueFIFO
  6. Description: QueueFIFO is designed for First-in-First-out rule.
  7. """
  8. def __init__(self):
  9. self.queue = collections.deque()
  10. def empty(self):
  11. return len(self.queue) == 0
  12. def put(self, node):
  13. self.queue.append(node) # enter from back
  14. def get(self):
  15. return self.queue.popleft() # leave from front
  16. class QueueLIFO:
  17. """
  18. Class: QueueLIFO
  19. Description: QueueLIFO is designed for Last-in-First-out rule.
  20. """
  21. def __init__(self):
  22. self.queue = collections.deque()
  23. def empty(self):
  24. return len(self.queue) == 0
  25. def put(self, node):
  26. self.queue.append(node) # enter from back
  27. def get(self):
  28. return self.queue.pop() # leave from back
  29. class QueuePrior:
  30. """
  31. Class: QueuePrior
  32. Description: QueuePrior reorders elements using value [priority]
  33. """
  34. def __init__(self):
  35. self.queue = []
  36. def empty(self):
  37. return len(self.queue) == 0
  38. def put(self, item, priority):
  39. count = 0
  40. for (p, x) in self.queue:
  41. if x == item:
  42. self.queue[count] = (priority, item)
  43. break
  44. count += 1
  45. if count == len(self.queue):
  46. heapq.heappush(self.queue, (priority, item)) # reorder x using priority
  47. def get(self):
  48. return heapq.heappop(self.queue)[1] # pop out the smallest item
  49. def enumerate(self):
  50. return self.queue
  51. def check_remove(self, item):
  52. for (p, x) in self.queue:
  53. if item == x:
  54. self.queue.remove((p, x))
  55. def top_key(self):
  56. return self.queue[0][0]