用循环链表实现队列
队首位于单链表的头结点处,队尾位于单链表的尾结点处,尾结点的指针域指向头结点;维护尾指针和链表长度;当加入元素时,依据尾指针在尾结点后添加新元素,取出元素时候依据尾指针,取出尾结点指向的头结点元素并删除头结点。
class CircularQueue:
"""用循环链表实现队列"""
class _Node:
""""""
__slots__ = "value", "next" # 因为会创建很多个结点对象,因此使用__slots__来减少内存占用
def __init__(self, value, next):
self.value = value
self.next = next
def __init__(self):
self._tail = None # 尾指针
self._size = 0 # 队列的元素数量
def __len__(self):
"""返回队列中元素的数量"""
return self._size
def is_empty(self):
"""返回队列是否为空"""
return self._size == 0
def first(self):
"""查询队首元素"""
if self.is_empty():
raise ValueError("Queue is Empty")
return self._tail.next.value
def pop(self):
"""取出队首元素"""
if self.is_empty():
raise ValueError("Queue is Empty")
head = self._tail.next
if self._size == 1:
self._tail = None
else:
self._tail.next = head.next # 令尾结点直接指向原头结点的下一个结点
self._size -= 1
return head.value
def add(self, value):
"""元素加入队尾"""
node = self._Node(value, None) # 构造链表对象
if self.is_empty():
node.next = node
else:
node.next = self._tail.next # 令新结点指向头结点
self._tail.next = node # 令原来的尾结点指向新结点
self._tail = node # 令尾指针指向新的尾结点(即新结点)
self._size += 1
操作的时间复杂度:
操作 | 时间复杂度 |
---|---|
len(S) | O ( 1 ) O(1) O(1) |
S.is_empty() | O ( 1 ) O(1) O(1) |
S.first() | O ( 1 ) O(1) O(1) |
S.pop() | O ( 1 ) O(1) O(1) |
S.add(value) | O ( 1 ) O(1) O(1) |