circlequeue.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. class CircularQueue:
  2. def __init__(self, max_size):
  3. """初始化一个环形队列"""
  4. self.queue = []
  5. self.max_size = max_size
  6. def __getitem__(self, index):
  7. """通过下标访问队列元素"""
  8. if len(self.queue) == 0:
  9. print("Queue is empty")
  10. return None
  11. return self.queue[index]
  12. def __iter__(self):
  13. """迭代器方法"""
  14. return iter(self.queue)
  15. def __contains__(self, item):
  16. """成员检查方法"""
  17. return item in self.queue
  18. def __len__(self):
  19. """返回队列长度"""
  20. return len(self.queue)
  21. def enqueue(self, item):
  22. """入队操作"""
  23. if len(self.queue) == self.max_size:
  24. _ = self.queue.pop(0)
  25. self.queue.append(item)
  26. def dequeue(self):
  27. """出队操作"""
  28. if len(self.queue) == 0:
  29. print("Queue is empty")
  30. return None
  31. return self.queue.pop(0)
  32. def remove_by_id(self, index):
  33. """根据下标移除元素"""
  34. if len(self.queue) == 0:
  35. print("Queue is empty")
  36. return -1
  37. if index >= len(self.queue) or index < 0:
  38. print("Index out of range")
  39. return -1
  40. _ = self.queue.pop(index)
  41. return 0
  42. def remove_by_value(self, value):
  43. """根据值移除元素"""
  44. if len(self.queue) == 0:
  45. print("Queue is empty")
  46. return -1
  47. index = -1
  48. for i in range(len(self.queue)):
  49. if self.queue[i] == value:
  50. index = i
  51. break
  52. if index == -1:
  53. # print("Value not found")
  54. return -1
  55. _ = self.queue.pop(index)
  56. return 0
  57. def test():
  58. queue = CircularQueue(5)
  59. queue.enqueue(1)
  60. queue.enqueue(2)
  61. queue.enqueue(3)
  62. queue.enqueue(4)
  63. assert queue[0] == 1
  64. assert queue[1] == 2
  65. assert queue.remove_by_id(2) == 0
  66. assert queue[2] == 4
  67. assert queue.remove_by_value(1) == 0
  68. assert queue[0] == 2
  69. assert queue.dequeue() == 2
  70. assert queue[0] == 4
  71. queue = CircularQueue(3)
  72. queue.enqueue("A")
  73. queue.enqueue("B")
  74. queue.enqueue("C")
  75. assert "A" in queue
  76. assert "D" not in queue
  77. assert len(queue) == 3
  78. assert queue.enqueue("D") == None
  79. assert "A" not in queue
  80. assert queue.dequeue() == "B"
  81. assert queue.remove_by_id(1) == 0
  82. assert "D" not in queue
  83. assert queue.remove_by_value("E") == -1
  84. assert queue.enqueue("1234")
  85. assert queue.enqueue("test aslkfjawep")
  86. assert queue.enqueue("alwk")
  87. # for item in queue:
  88. # print(item)
  89. print("PASS")
  90. test()