堆疊 (Stack) 簡介

歡迎!在本章中,我們將探討計算機科學中最基礎且使用最頻繁的數據結構之一:堆疊 (Stack)。堆疊在追蹤任務、反轉數據,甚至是協助電腦執行子程序(subroutine)方面都非常有用。讀完這些筆記後,你將會明白它們的運作原理、如何使用它們,以及為什麼它們對於你的 AQA A Level 考試如此重要。

如果數據結構起初看起來有點抽象,不用擔心——我們會用大量的日常例子來讓你清楚理解!

什麼是堆疊?

堆疊是一種抽象數據類型 (Abstract Data Type, ADT)。這意味著它是一個關於數據應如何組織和存取的概念模型。它遵循一條非常明確的規則,稱為 LIFO,即 後進先出 (Last-In, First-Out)

類比:想像一個自助餐廳的托盤堆
1. 你把一個新托盤放到這堆東西的最頂端
2. 如果你想拿一個托盤,你只能拿最頂端的那一個。
3. 第一個放下的托盤(最底部的那個)必須等到它上面所有的托盤都被移走後,才能被取走。

關鍵術語:LIFO

在堆疊中,你添加的最後一個項目,就是你必須移除的第一個項目。你永遠只能與堆疊的「頂端」進行互動。

快速回顧:LIFO 規則

Last In (後進)
First Out (先出)
• 把它想像成一罐品客薯片——工廠最後放進去的薯片,就是你第一個吃到的!

基本的堆疊運算

根據你的課程大綱,你需要確切知道如何描述和應用這五種運算:

1. Push (推入)

Push 運算會將新項目添加到堆疊的頂端
步驟如下:
1. 檢查堆疊是否已滿(以避免堆疊溢位 Stack Overflow)。
2. 增加頂端指標 (top pointer)(將其向上移動一個位置)。
3. 將新數據插入該位置。

2. Pop (彈出)

Pop 運算會從堆疊的頂端移除該項目,並通常會回傳其值。
步驟如下:
1. 檢查堆疊是否為空(以避免堆疊下溢 Stack Underflow)。
2. 存取目前頂端指標處的數據。
3. 減少頂端指標(將其向下移動一個位置)。

3. Peek (查看) 或 Top

Peek 運算會回傳頂端元素的值但不會將其移除。就像看一眼最上面的托盤是什麼顏色,而不用把它拿起來一樣。

4. Test for Empty Stack (isEmpty)

這會檢查堆疊中是否有任何項目。如果頂端指標處於起始位置(根據實作方式通常為 -1 或 0),則堆疊為空 (empty)

5. Test for Stack Full (isFull)

如果堆疊是使用固定大小的陣列(靜態數據結構)來實作的,它可能會空間不足。此運算會檢查頂端指標是否已達到最大容量。

重點總結

Push 用於添加,Pop 用於移除,Peek 用於查看。在 Push 之前務必檢查堆疊是否已滿 (Full),在 Pop 之前檢查是否為空 (Empty)

實作:記憶體中的運作方式

在考試中,你可能會被問到堆疊實際上是如何構建的。最常見的情況是,堆疊是使用陣列 (array)頂端指標 (top pointer) 來實作的。

陣列 (Array):儲存數據的連續記憶體位置。
頂端指標 (Top Pointer):儲存目前頂端元素索引(位置)的變數。

你知道嗎?
當我們在 Pop 運算中「移除」一個項目時,數據並不會立即從記憶體中刪除。我們只是簡單地將頂端指標向下移動。電腦會將該「彈出」的空間視為空白,儘管舊的位元(bits)仍然存在,直到它們被新的 Push 運算覆蓋為止!

常見錯誤

指標位置:有些程式設計師將頂端指標設定在 \( -1 \)(表示堆疊為空),而有些則從 \( 0 \) 開始。請務必仔細閱讀考試題目,看看它是如何定義「空」的。
運算順序:Push 時,你必須在添加數據之前增加指標。而 Pop 時,你通常在減少指標之前獲取數據。

堆疊的實際應用

堆疊不僅僅存在於教科書中;它們幾乎被用於你使用的每一款軟體中!

1. 復原 (Undo) 按鈕

每次你在文書處理軟體中輸入一個字母,它都會被 Push 到一個堆疊中。當你按下「復原」時,電腦會從堆疊中 Pop 出最後的操作來將其撤銷。

2. 瀏覽器中的「返回」按鈕

當你瀏覽網站時,每個網址(URL)都會被 Push 到一個堆疊中。當你點擊「返回」時,目前的頁面會從堆疊中 Pop 出,顯示出前一個頁面。

3. 子程序呼叫 (堆疊幀 Stack Frames)

這是 AQA 課程大綱(4.1.1.15 節)的一個特定部分。當程式呼叫一個函數(子程序)時,它會使用堆疊幀 (stack frame) 來儲存:
返回位址 (Return addresses):函數結束後要返回哪裡。
參數 (Parameters):傳遞給函數的數據。
區域變數 (Local variables):僅在該函數內部存在的變數。

4. 逆向波蘭表示法 (Reverse Polish Notation, RPN)

堆疊被用於評估 RPN 中的數學表達式(4.3.3.1 節)。例如,\( 3 + 4 \) 寫作 \( 3 \ 4 \ + \)。電腦將 3 和 4 Push 到堆疊中,然後當它看到 \( + \) 時,它會將兩者 Pop 出來,將它們相加,然後將結果再 Push 回堆疊。

快速回顧:堆疊的用途

• 回溯 (Backtracking)(復原/返回按鈕)
• 函數呼叫(遞迴和堆疊幀)
• 反轉數據
• 表達式評估 (RPN)

摘要表

運算 | 說明
Push | 將項目添加到頂端。增加指標。
Pop | 移除並回傳頂端項目。減少指標。
Peek | 回傳頂端項目但不移除它。
isEmpty | 如果堆疊中沒有項目,回傳 True
isFull | 如果靜態堆疊達到最大容量,回傳 True

考試重點總結

如果你看到關於堆疊的問題,請記住 LIFO。永遠要檢查溢位 (Overflow)(向已滿的堆疊 Push)和下溢 (Underflow)(從空的堆疊 Pop)。如果你能描述這些運算並畫出一個帶有移動指標的簡單陣列,那麼你離獲得高分就不遠了!