用單鏈表實現隊列
隊首位於單鏈表的頭結點處,隊尾位於單鏈表的尾結點處,維護頭指針、尾指針和鏈表長度;加入元素時依據尾指針添加到尾結點後,取出元素時候依據頭指針取出元素並刪除頭結點。
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) |