iT邦幫忙

2025 iThome 鐵人賽

DAY 11
0
自我挑戰組

演算法 30 Days --- 從小牛變水牛系列 第 11

Day11 資料結構:Stack (堆疊) & Queue (佇列)

  • 分享至 

  • xImage
  •  

今天來學習兩個新的資料結構,Stack (堆疊)Queue (佇列)

Stack (堆疊)

概念

Stack 是一種 FILO (先進後出) 的資料結構,所謂 FILO 就是,先放進 Stack 的資料,再取出的時候,會是最後一個被取出的,也可以說是 LIFO (後進先出),如下圖
image

操作

Stack基礎操作有兩個,放資料取資料,通常寫作 pushpop (因為都從頂部操作)。

會有一個 top追蹤頂部在哪裡

參考程式碼

class Stack:
    def __init__(self, size):
        self.size = size
        self.items = [None] * size # 預先配置大小,用 List 代替 Array
        self.top = 0  

    def is_empty(self):  # 判斷 stack 是否為空
        return self.top == 0

    def is_full(self):  # 判斷 stack 是否為滿了
        return self.top == self.size

    def push(self, data):  # 放一個資料進 stack
        if self.is_full():
            raise Exception("Overflow")
        self.items[self.top] = data
        self.top += 1

    def pop(self):  # 取一個資料出來
        if self.is_empty():
            raise Exception("Underflow")
        self.top -= 1
        item = self.items[self.top]
        self.items[self.top] = None
        return item

Queue (佇列)

概念

Queue 是一種 FIFO (先進先出) 的資料結構,所謂 FIFO 就是,先放進 Queue 的資料,再取出的時候,會是第一個被取出的,如下圖
image

操作

Queue基礎操作有兩個,放資料取資料,通常寫作 enqueuedequeue

會有一個 headtail (也有人用 frontrear) 來追蹤最前面跟最後面在哪裡

參考程式碼

class Queue:
    def __init__(self, size):
        self.size = size
        self.items = [None] * size  # 預先配置大小,用 List 代替 Array
        self.head = 0  # 最前面的
        self.tail = 0  # 最後面的
        self.count = 0 # 裡面有多少

    def is_empty(self):
        return self.count == 0

    def is_full(self):
        return self.count == self.size

    def enqueue(self, data): # 放一個資料進 queue
        if self.is_full():
            raise Exception("Overflow")
        self.items[self.tail] = data
        self.tail = (self.tail + 1) % self.size # 透過 mod 避免 tail 無限增長
        self.count += 1
        return

    def dequeue(self):  # 取一個資料出來
        if self.is_empty():
            raise Exception("Underflow")  
        data = self.items[self.head]
        self.items[self.head] = None
        self.head = (self.head + 1) % self.size # 透過 mod 避免 head 無限增長
        self.count -= 1

        return data


上一篇
Day10 資料結構:鏈結串列 (Linked List)
系列文
演算法 30 Days --- 從小牛變水牛11
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言