用循環鏈表實現隊列
隊首位於單鏈表的頭結點處,隊尾位於單鏈表的尾結點處,尾結點的指針域指向頭結點;維護尾指針和鏈表長度;當加入元素時,依據尾指針在尾結點後添加新元素,取出元素時候依據尾指針,取出尾結點指向的頭結點元素並刪除頭結點。
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) | |
S.is_empty() | |
S.first() | |
S.pop() | |
S.add(value) |