軟體工程師職涯升級計畫啟動!立即預約職涯諮詢、履歷健檢或模擬面試👈,為您的加薪做好準備!
在學習演算法與資料結構的過程中,我逐漸理解:「選擇合適的資料結構,才能讓解題事半功倍」。近期參加 AC 演算法專攻班,逐步掌握了如何根據題目選擇正確的資料結構,其中最常見、也最具代表性的,就是「Stack 堆疊」。
這篇筆記將帶你深入理解 Stack 的結構、操作方法、時間複雜度、實作方式與應用場景,並附上 LeetCode 範例與 JavaScript 實作。
一、Stack 堆疊是什麼?
Stack(堆疊)是一種 後進先出(LIFO, Last In First Out) 的資料結構。你可以把它想像成「餐盤堆疊」:
最上面的餐盤最先被拿走,而最下面的要等到上面的都移除後才能被拿。

二、Stack 的結構與特性
✅ 結構
在 JavaScript 中,我們可以利用陣列(Array)來模擬 Stack 的行為。
js
複製編輯function Stack() {
let items = []; // 使用陣列儲存堆疊元素
}
✅ 特性

三、Stack 操作流程圖解
以以下操作為例:
- 初始為空
- Push(6)、Push(3)、Push(7)
- Pop() → 移除 7
- Push(14)、Push(8)
🧱 每次 Push 都會將元素放在頂部

🧹 Pop 會移除最上方元素 🔍 Top 會回傳目前最上方(如上圖為 8)
若你需要「逐個取出」Stack 中所有資料,只能用連續 Pop(),無法像陣列那樣用 index 存取。
四、JavaScript Stack 實作
js
複製編輯class Stack {
constructor() {
this.items = [];
}
push(value) {
this.items.push(value);
}
pop() {
return this.items.pop();
}
top() {
return this.items[this.items.length - 1];
}
isEmpty() {
return this.items.length === 0;
}
getSize() {
return this.items.length;
}
print() {
console.log(this.items);
}
}
// ✅ 測試
const s = new Stack();
s.push(6);
s.push(3);
s.push(7);
s.pop(); // 移除 7
s.push(14);
s.push(8);
console.log(s.top()); // 8
console.log(s.isEmpty()); // false
console.log(s.getSize()); // 4
s.print(); // [6, 3, 14, 8]
五、Stack 的應用場景
Stack 的核心功能是「記得之前做過什麼」,因此廣泛應用於 回溯(Backtracking)與狀態保存 的場景:
🔄 Undo/Redo 系統(如 Word 編輯器)
🌐 瀏覽器的上一頁功能
🧭 深度優先搜尋(DFS)
📦 函式遞迴呼叫堆疊
📚 中序/後序/前序樹的遍歷
💻 LeetCode 題目實作
六、LeetCode 題目範例:Maximum Binary Tree
題目連結:
Maximum Binary Tree - LeetCode
題目描述:
給定一個沒有重複元素的整數陣列,建構「最大二元樹」。最大二元樹的定義如下:
- 根節點是陣列中的最大值
- 左子樹是最大值左側子陣列建構出的最大二元樹
- 右子樹是最大值右側子陣列建構出的最大二元樹
js
複製編輯var constructMaximumBinaryTree = function(nums) {
if (nums.length === 0) return null;
if (nums.length === 1) return new TreeNode(nums[0]);
let maxIndex = getMaxIndex(nums);
let maxVal = nums[maxIndex];
let rootNode = new TreeNode(maxVal);
rootNode.left = constructMaximumBinaryTree(nums.slice(0, maxIndex));
rootNode.right = constructMaximumBinaryTree(nums.slice(maxIndex + 1));
return rootNode;
};
var getMaxIndex = function(arr) {
let maxIndex = 0;
for (let i = 1; i < arr.length; i++) {
if (arr[i] > arr[maxIndex]) maxIndex = i;
}
return maxIndex;
};
這題若要用 Stack 實作,還能優化到 O(n)(進階可參考:單調堆疊技巧)。
七、延伸學習與資源推薦
📚 Visualgo – 動畫演示 Stack 與各種資料結構
📖 《Cracking the Coding Interview》– Stack 常見面試題彙整
小結
Stack 是資料結構中的基礎功之一。雖然概念簡單,但它在遞迴、搜尋與狀態回溯中的應用卻無處不在。
掌握 Stack,不僅能幫你理解演算法的本質,更能成為你日後解題路上的強大工具。
🔧 若你需要更進一步的互動圖解、動畫、或搭配實戰題目進行練習,也可以告訴我,我可以幫你規劃對應的學習路線!
要我幫你繼續整理 Queue、Tree 或 Hash Table 也 OK!