資料結構筆記: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
跨越國界的程式人生
5會員
41內容數
自學程式,現為網頁開發工程師,同時擔任線上課程講師,專注於幫助自學程式的開發者找到理想工作。熱愛技術與分享,致力於將複雜的概念轉化為實用知識,讓更多人踏入軟體開發的世界。
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
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
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 請求範例
Thumbnail
題目敘述 題目會給我們一組定義好的界面和需求,要求我們設計一個資料結構,可以滿足平均O(1)的插入元素、刪除元素、隨機取得元素的操作。 RandomizedSet() 類別建構子 bool insert(int val) 插入元素的function界面 bool remove(int val
Thumbnail
題目敘述 題目會給我們一組定義好的界面和需求,要求我們設計一個資料結構,可以滿足平均O(1)的插入元素、刪除元素、隨機取得元素的操作。 RandomizedSet() 類別建構子 bool insert(int val) 插入元素的function界面 bool remove(int val
Thumbnail
有個簡單的方法,把儲存格的文字串連起來!一起來看看怎麼做,很好操作唷!
Thumbnail
有個簡單的方法,把儲存格的文字串連起來!一起來看看怎麼做,很好操作唷!
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News