1. 程式人生 > 其它 >吉米_王:詳解雙端佇列的構造

吉米_王:詳解雙端佇列的構造

技術標籤:資料結構順序表資料結構演算法連結串列佇列指標

計劃在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()