iT邦幫忙

2025 iThome 鐵人賽

DAY 6
0

Queue (佇列) 與 Stack 一樣,是一種線性資料結構,但它遵循的是先進先出 (First-In-First-Out; FIFO) 的規則。你可以把 Queue 想像成排隊買票: 最早排隊的人會最先買到票並離開,而新加入的人只能站在隊伍最後。

簡單來說,Queue 的操作只允許在「尾端」加入元素,在「前端」移除元素。

Queue 的基本操作

Queue 與 Stack 的差異就在於操作的方向:

  • enqueue: 將元素放到 Queue 尾端
  • dequeue: 將 Queue 前端的元素移除並回傳
  • peek/front: 查看 Queue 前端的元素,但不移除
  • is_empty: 檢查 Queue 是否為空
  • size: 回傳 Queue 的大小

自己建立一個 Queue

其實 Queue 跟 Stack 差不多,操作都很簡單,直接使用 Python 來自定義一個 Queue 的資料結構,來進行演示。

  • Create a Queue class

    和 Stack 一樣,先建立建構子與迭代器,使用 Python 的 list 模擬:

class Queue:
    def __init__(self):
        self.data = []

    def __iter__(self):
        for item in self.data:
            yield item
  • Create an enqueue() method

    enqueue 就是將元素加到尾端,對應到 Python list 的 append()

class Queue:
    def __init__(self):
        self.data = []

    def __iter__(self):
        for item in self.data:
            yield item
    
    def enqueue(self, item):
        self.data.append(item)
  • Create a dequeue() method

    dequeue 是移除前端元素,對應到 Python list 的 pop(0)

class Queue:
    def __init__(self):
        self.data = []

    def __iter__(self):
        for item in self.data:
            yield item
    
    def enqueue(self, item):
        self.data.append(item)

    def dequeue(self):
        return self.data.pop(0)
  • Create a peek() method

    peek 是查看前端的元素,但不移除。

class Queue:
    def __init__(self):
        self.data = []

    def __iter__(self):
        for item in self.data:
            yield item
    
    def enqueue(self, item):
        self.data.append(item)

    def dequeue(self):
        return self.data.pop(0)

    def peek(self):
        return self.data[0]
  • Create an is_empty() method

    檢查 Queue 是否為空。

class Queue:
    def __init__(self):
        self.data = []

    def __iter__(self):
        for item in self.data:
            yield item
    
    def enqueue(self, item):
        self.data.append(item)

    def dequeue(self):
        return self.data.pop(0)

    def peek(self):
        return self.data[0]
        
    def is_empty(self):
        return self.data == []

結語

今天介紹了 Queue,這是一種限制操作位置的線性資料結構,與 Stack 最大的不同是遵循 FIFO,新元素只能從尾端加入,舊元素只能從前端移除。

Queue 在日常生活與程式設計中都非常常見,例如: 作業系統的工作排程、網路中的封包緩衝區、樹或圖的廣度優先搜尋 (BFS) 等,都需要用到 Queue。

在 Python 中,可以用 list 或 collections.deque 來實作 Queue;在 Java 中,常用 LinkedList 或 ArrayDeque。雖然實作方式不同,但本質上都保留了 Queue 的特性。


上一篇
(Day 5) 堆疊 (Stack)
下一篇
(Day 7) 二元樹 (Binary Tree)
系列文
快速掌握資料結構與演算法8
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言