用单链表实现队列
队首位於单链表的头结点处,队尾位於单链表的尾结点处,维护头指针、尾指针和链表长度;加入元素时依据尾指针添加到尾结点后,取出元素时候依据头指针取出元素并删除头结点。
class LinkedQueue:
"""单链表实现的队列"""
class _Node:
""""""
__slots__ = "value", "next" # 因为会创建很多个结点对象,因此使用__slots__来减少内存占用
def __init__(self, value, next):
self.value = value
self.next = next
def __init__(self):
self._head = None # 头指针
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._head.value
def pop(self):
"""取出队首元素"""
if self.is_empty():
raise ValueError("Queue is Empty")
ans = self._head.value
self._head = self._head.next
self._size -= 1
if self.is_empty():
self._tail = None
return ans
def add(self, value):
"""元素加入队尾"""
node = self._Node(value, None) # 构造链表对象
if self.is_empty():
self._head = node
else:
self._tail.next = node
self._tail = node
self._size += 1
操作的时间复杂度:
操作 | 时间复杂度 |
---|---|
len(S) | |
S.is_empty() | |
S.first() | |
S.pop() | |
S.add(value) |