資料結構筆記:Stack 堆疊的特性與實作

更新 發佈閱讀 7 分鐘

軟體工程師職涯升級計畫啟動!立即預約職涯諮詢、履歷健檢或模擬面試👈,為您的加薪做好準備!

在學習演算法與資料結構的過程中,我逐漸理解:「選擇合適的資料結構,才能讓解題事半功倍」。近期參加 AC 演算法專攻班,逐步掌握了如何根據題目選擇正確的資料結構,其中最常見、也最具代表性的,就是「Stack 堆疊」。

這篇筆記將帶你深入理解 Stack 的結構、操作方法、時間複雜度、實作方式與應用場景,並附上 LeetCode 範例與 JavaScript 實作。


一、Stack 堆疊是什麼?

Stack(堆疊)是一種 後進先出(LIFO, Last In First Out) 的資料結構。

你可以把它想像成「餐盤堆疊」:

最上面的餐盤最先被拿走,而最下面的要等到上面的都移除後才能被拿。

raw-image

二、Stack 的結構與特性

結構

在 JavaScript 中,我們可以利用陣列(Array)來模擬 Stack 的行為。

js
複製編輯function Stack() {
let items = []; // 使用陣列儲存堆疊元素
}

特性

raw-image

三、Stack 操作流程圖解

以以下操作為例:

  1. 初始為空
  2. Push(6)、Push(3)、Push(7)
  3. Pop() → 移除 7
  4. Push(14)、Push(8)

🧱 每次 Push 都會將元素放在頂部

raw-image

🧹 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)(進階可參考:單調堆疊技巧)。


七、延伸學習與資源推薦

📚 Chiu's Blog:Stack 介紹與實作教學

📚 Visualgo – 動畫演示 Stack 與各種資料結構

💻 LeetCode Stack 題目整理

📖 《Cracking the Coding Interview》– Stack 常見面試題彙整


小結

Stack 是資料結構中的基礎功之一。雖然概念簡單,但它在遞迴、搜尋與狀態回溯中的應用卻無處不在。

掌握 Stack,不僅能幫你理解演算法的本質,更能成為你日後解題路上的強大工具。


🔧 若你需要更進一步的互動圖解、動畫、或搭配實戰題目進行練習,也可以告訴我,我可以幫你規劃對應的學習路線!

要我幫你繼續整理 Queue、Tree 或 Hash Table 也 OK!

留言
avatar-img
留言分享你的想法!
avatar-img
跨越國界的程式人生
3會員
40內容數
自學程式,現為網頁開發工程師,同時擔任線上課程講師,專注於幫助自學程式的開發者找到理想工作。熱愛技術與分享,致力於將複雜的概念轉化為實用知識,讓更多人踏入軟體開發的世界。
2025/07/22
軟體工程師職涯升級計畫啟動!本文深入探討陣列與串列這兩種基礎資料結構,比較其特性、優缺點與常見操作,並輔以JavaScript範例程式碼及時間複雜度分析,幫助讀者學習如何根據不同情境選擇合適的資料結構,寫出更高效的程式。
Thumbnail
2025/07/22
軟體工程師職涯升級計畫啟動!本文深入探討陣列與串列這兩種基礎資料結構,比較其特性、優缺點與常見操作,並輔以JavaScript範例程式碼及時間複雜度分析,幫助讀者學習如何根據不同情境選擇合適的資料結構,寫出更高效的程式。
Thumbnail
2025/07/22
本文深入探討各種資料模型(關聯式、文件、圖形)及其查詢語言(SQL、MapReduce、Cypher、SPARQL),比較其優缺點及適用場景,並以實際案例說明如何選擇最適合的資料模型與查詢語言。
Thumbnail
2025/07/22
本文深入探討各種資料模型(關聯式、文件、圖形)及其查詢語言(SQL、MapReduce、Cypher、SPARQL),比較其優缺點及適用場景,並以實際案例說明如何選擇最適合的資料模型與查詢語言。
Thumbnail
2025/07/21
這篇文章整理了軟體工程師技術面試常見的演算法題型,包含排列組合、搜尋、排序、樹與鏈結串列等,並提供對應的JavaScript實作與LeetCode題號,幫助你係統性準備面試。
Thumbnail
2025/07/21
這篇文章整理了軟體工程師技術面試常見的演算法題型,包含排列組合、搜尋、排序、樹與鏈結串列等,並提供對應的JavaScript實作與LeetCode題號,幫助你係統性準備面試。
Thumbnail
看更多
你可能也想看
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
這篇內容,將會講解什麼是陣列,以及與陣列相關的知識。包括陣列的簡介、陣列的資料限制、陣列的維度、一維陣列、二維陣列。
Thumbnail
這篇內容,將會講解什麼是陣列,以及與陣列相關的知識。包括陣列的簡介、陣列的資料限制、陣列的維度、一維陣列、二維陣列。
Thumbnail
CSS 盒模型是理解和設計網頁佈局的核心概念。它包括元素的內容、填充、邊框和外邊距。
Thumbnail
CSS 盒模型是理解和設計網頁佈局的核心概念。它包括元素的內容、填充、邊框和外邊距。
Thumbnail
這篇內容,將會講解什麼是資料型態,以及與資料型態相關的知識。包括資料型態的簡介、實數、布林值、 字串、陣列。
Thumbnail
這篇內容,將會講解什麼是資料型態,以及與資料型態相關的知識。包括資料型態的簡介、實數、布林值、 字串、陣列。
Thumbnail
視覺層級並不侷限於平面設計,在用戶體驗及介面上更是一個重要的核心之一。視覺層級除了讓畫面的視覺編排更加精緻好看,更重要的功能是能讓畫面有效地被組織,讓觀者更容易理解。
Thumbnail
視覺層級並不侷限於平面設計,在用戶體驗及介面上更是一個重要的核心之一。視覺層級除了讓畫面的視覺編排更加精緻好看,更重要的功能是能讓畫面有效地被組織,讓觀者更容易理解。
Thumbnail
資訊架構就像是網站的地圖,讓用戶快速找到所需的資訊。好的資訊架構可提升使用者滿意度、強化 SEO、增進擴充性、達成商業目標。資訊架構可透過使用者訪談、卡片分析、競品分析、使用者測試等方法設計。在設計資訊架構時,需考量用戶的認知方式、目標客群、資訊分類等因素。定期檢驗資訊架構,才能確保用戶體驗。
Thumbnail
資訊架構就像是網站的地圖,讓用戶快速找到所需的資訊。好的資訊架構可提升使用者滿意度、強化 SEO、增進擴充性、達成商業目標。資訊架構可透過使用者訪談、卡片分析、競品分析、使用者測試等方法設計。在設計資訊架構時,需考量用戶的認知方式、目標客群、資訊分類等因素。定期檢驗資訊架構,才能確保用戶體驗。
Thumbnail
JavaScript 套件,頁碼 Pagination.js 搭配 axios API 請求範例
Thumbnail
JavaScript 套件,頁碼 Pagination.js 搭配 axios API 請求範例
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News