在之前的教學中,已經學會了Node和Linked List的實作,
用Python實現了單向鏈結串列Singly linked list、雙向鏈結串列Doubly linked list。
今天要從Python 內建deque資料結構的角度切入,當作複習,
同時了解deque 與 FIFO Queue相關的function用法。
在Python中,collections.deque
是一種兩端點皆可進出的雙端佇列
(double-ended queue),允許在兩端點高效地在O(1)常數時間內添加和刪除元素。
這使得deque
非常適合實現FIFO Queue(FIFO代表First In First Out 先進先出)。
以下是有關deque
和FIFO Queue相關的function操作教學及範例。
deque
是一種長度可伸縮的的長條鏈狀資料結構,from collections import deque
# 方法1: 建立一個空的deque
my_deque = deque()
# 方法2: 建立一個deque,並且以[1,2,3]最為初始值
my_deque = deque([1, 2, 3])
print(my_deque) # 輸出: deque([1, 2, 3])
my_deque.append(4) # 在右端點新增4
my_deque.appendleft(0) # 在左端點新增0
print(my_deque) # 輸出: deque([0, 1, 2, 3, 4])
my_deque.pop() # 從右端點刪除元素4
print(my_deque) # 輸出: deque([0, 1, 2, 3])
my_deque.popleft() # 從左端點刪除元素0
print(my_deque) # 輸出: deque([1, 2, 3])
# 目前deque = ([1, 2, 3]) 裡面總共有三個元素
print( len(my_deque) ) # 輸出: 3
我們可以使用deque
來實現一個FIFO Queue佇列,示意圖與程式碼如下。
from collections import deque
class MyQueue:
# 建構子
def __init__(self):
self.queue = deque()
# 在尾巴新增新資料
def enqueue(self, item):
self.queue.append(item)
# 從頭部取出舊資料
def dequeue(self):
if not self.is_empty():
return self.queue.popleft()
else:
raise IndexError("dequeue from an empty queue")
# 得到目前位在排頭的資料
def peek(self):
if not self.is_empty():
return self.queue[0]
else:
raise IndexError("peek from an empty queue")
# 檢查佇列是否為空
def is_empty(self):
return len(self.queue) == 0
# 取得佇列目前的長度 = Queue 目前擁有的資料總數
def __len__(self):
return len(self.queue)
queue = MyQueue()
queue.enqueue(1)
queue.enqueue(2)
queue.enqueue(3)
print("Dequeued element:", queue.dequeue() ) # 輸出: Dequeued element: 1
print("Front element:", queue.peek() ) # 輸出: Front element: 2
print("Is queue empty?", queue.is_empty() ) # 輸出: Is queue empty? False
print("Queue size:", len(queue) ) # 輸出: Queue size: 2, 此時quque = ([2, 3])
[1] collections — Container datatypes — Python 3.13.0 documentation