吉米_王:詳解雙端佇列的構造
阿新 • • 發佈:2021-01-17
計劃在2021年課改時,要把雙端佇列加入到人工智慧專業教學中!!!
雙端佇列:
雙端佇列(deque,全名double-ended queue),是一種具有佇列和棧的性質的資料結構;
雙端佇列中的元素可以從兩端彈出,其限定插入和刪除操作在表的兩端進行;
雙端佇列可以在佇列任意一端入隊和出隊;
雙端佇列示意圖:
雙端佇列程式碼構造(連結串列實現)
class Node(object):
"""結點類"""
def __init__(self, item) :
"""例項屬性初始化和賦值"""
self.item = item
self.next = None
class Queue(object):
def __init__(self, head=None, end=None):
# 初始化頭結點遊標指標
self.head = head
# 初始化尾結點遊標指標
self.end = end
def add(self, item):
"""頭部新增"""
# 例項化一個新結點
node = Node(item)
# 頭結點存在情況
if self.head:
cur = self.head
node.next = cur
self.head = node
# 頭結點不存在的情況
else:
self.head = node
self.end = node
def append(self, item):
"""尾部新增"""
# 例項化一個新結點
node = Node(item)
# 尾結點存在情況
if self.end:
# 直接調整尾結點next指標指向新節點
cur = self.end
cur.next = node
self.end = node
# 尾結點不存的情況
else:
self.head = node
self.end = node
def head_remove(self):
"""頭部刪除"""
# 頭結點存在的情況
if self.head:
# 儲存頭結點
cur = self.head
# 判斷是不是孤立結點
# 如果不是孤立結點,正常刪除
if cur.next is not None:
node = cur.next
self.head = node
# 如果是孤立結點,則頭結點指向None,就代表刪除成功
else:
self.head = None
return
def end_remove(self):
"""尾部刪除"""
# 判斷尾結點是否存在
# 存在的情況
if self.end:
# 建立兩個臨時遊標節後頭結點和None物件
cur = self.head
pro = None
# 構造查詢尾結點的迴圈條件
while cur.next is not None:
# 迴圈內部,兩個遊標正常移動並賦值
pro = cur
cur = cur.next
# 迴圈終止,說明cur已經定位到尾節點,如果要刪除尾結點
# 只需要讓前面的pro節點指向為None即可
pro.next = None
return
def treavl(self):
# 空連結串列情況
if self.head is None:
return
# 不為空連結串列的情況
cur = self.head
# 構造從頭結點迴圈到尾結點的條件
while cur is not None:
# 列印節點元素
print(cur.item)
# 移動遊標
cur = cur.next
return
if __name__ == '__main__':
q = Queue()
q.add(1)
q.add(2)
q.append(3)
q.append(4)
q.append(5)
q.treavl()
print("---------------------")
q.head_remove()
q.end_remove()
q.treavl()