Python 資料結構 : 堆疊 (Stack)(05)

前言

在程式設計與演算法學習的過程中,堆疊(Stack)是必不可少的資料結構。它簡單卻強大,廣泛應用於函數呼叫管理、字串處理、復原功能以及數學表達式計算。若把資料結構比喻為建築工法,那麼堆疊就是最常見的「模板」,學會它能讓你更容易理解後續更複雜的資料結構與演算法。

堆疊的核心概念

什麼是堆疊?

堆疊是一種線性資料結構,只允許在「頂部」進行操作。這意味著:

  • Push(推入):將元素添加到頂部
  • Pop(彈出):移除頂部元素並返回其值
  • Peek(查看):檢視頂部元素但不移除

日常生活中的例子包括:

  • 書桌上的書堆
  • 餐廳裡疊放的盤子
  • 軟體中的復原(Undo)與重做(Redo)功能

三大基本操作

  1. Push 推入
    • 將新元素加入堆疊頂部
    • 新元素成為新的頂部
    • 堆疊大小增加
  2. Pop 彈出
    • 移除並返回堆疊頂部元素
    • 堆疊大小減少
  3. Peek 查看
    • 返回頂部元素的值,但不移除
    • 堆疊內容保持不變

建立基礎 Stack 類別

首先建立 Stack 類別,並初始化頂部節點:

class Stack:
    def __init__(self):
      self.top_item = None

此時,top_item 追蹤堆疊的頂部節點,初始狀態為空。

實作 Peek 方法

peek() 方法讓我們能夠查看堆疊頂部的值,而不會改變堆疊的內容。這在我們需要檢查下一個要處理的項目時特別有用。

def peek(self):
    return self.top_item.get_value()
peek operation stack visualization

實作 Push 操作

將元素添加到堆疊頂部

push() 方法是堆疊最重要的操作之一。它將新的元素添加到堆疊的頂部,並正確地重新鏈接所有節點。

實作步驟:

  1. 建立新的 Node 實例
  2. 設定新節點的 next 指向當前頂部
  3. 更新 top_item 為新節點
def push(self, value):
    item = Node(value)
    item.set_next_node(self.top_item)
    self.top_item = item

實作 Pop 操作

pop() 方法從堆疊頂部移除元素並返回其值。這是一個具有破壞性的操作,會永久改變堆疊的內容。

保存要移除的項目

將當前的 top_item 儲存到 item_to_remove 變數中

更新頂部指標

將 top_item 設定為 item_to_remove 的下一個節點

返回移除的值

使用 get_value() 方法返回被移除元素的值

def pop(self):
 item_to_remove = self.top_item
 self.top_item = item_to_remove.get_next_node()
 return item_to_remove.get_value()

為什麼需要控制大小?

在實際應用中,記憶體是有限的資源。如果我們不限制堆疊的大小,程式可能會:

  • 消耗過多記憶體
  • 導致系統效能下降
  • 引發堆疊溢位錯誤
  • 造成程式崩潰

因此,我們加入追蹤機制:

def __init__(self, limit=1000):
    self.top_item = None
    self.limit = limit
    self.size = 0
memory overflow warning illustration

改良後的方法

Push

def push(self, value):
    if self.has_space():
        item = Node(value)
        item.set_next_node(self.top_item)
        self.top_item = item
        self.size += 1
    else:
        print("空間不足!")

Pop

def pop(self):
    if not self.is_empty():
        item_to_remove = self.top_item
        self.top_item = item_to_remove.get_next_node()
        self.size -= 1
        return item_to_remove.get_value()
    else:
        print("堆疊為空!")

Peek

def peek(self):
    if not self.is_empty():
        return self.top_item.get_value()
    else:
        print("堆疊為空!")

結語

堆疊雖然是一種基礎資料結構,但它在程式世界中的地位卻相當關鍵。從函數呼叫堆疊到軟體的復原功能,甚至演算法中的表達式運算與括號檢查,堆疊都扮演著核心角色。

python programming achievement celebration

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

返回頂端