堆疊(Stack)
堆疊(Stack)
介紹
堆疊是資料結構的一種,將數據排成一列,可以把它想像在疊積木,資料不斷往上堆疊,每次取出資料時,只能從最上方的資料開始拿起
- 後進先出原理,稱為
Last in First out,簡稱LIFO - 資料無
index - 只能從最上方加入,並從最上方開始拿取

(圖片取自於Stacks & Queues)
複雜度
時間複雜度
| Action動作 | 平均 | 最壞 |
|---|---|---|
| 訪問(Access) | $O(n)$ | $O(n)$ |
| 搜尋(Search) | $O(n)$ | $O(n)$ |
| 插入(Insertion) | $O(1)$ | $O(1)$ |
| 刪除(Deletion) | $O(1)$ | $O(1)$ |
空間複雜度
$O(n)$
空間複雜度隨著 Stack 中元素的數量線性增長
利用 JS 模擬 Stack
Js Array寫法
我們可以利用js array達成stack效果,利用push新增資料在末端,要取出資料使用pop方法即可
let stack = []; |
Object Property
以下利用物件導向實作
初始化Node
class Node { |
初始化Stack
新增頭跟尾
class Stack { |
Stack新增push方法
將物件插入 Stack 的頂端。

(圖片來自於visualgo)
- 創建一個新的節點
newNode並將其初始化為value。 - 檢查是否為空串列,是的話則將
head和tail都指向新的節點 - 否則將
head指向新的節點,並將新的節點的next屬性指向舊的head(即舊的頂端)。 stack長度加一
push(value) { |
Stack新增pop方法
移除並傳回在
Stack頂端的物件。

(圖片來自於visualgo)
- 檢查是否為空列表,如果是,則返回
null - 如果列表長度為
1,則將head和tail都設置為null,並將列表長度設置為0,最後返回被移除的節點 - 如果列表長度大於 1,則將 head 設置為它的下一個節點,並將列表長度減 1,最後返回被移除的節點。
pop(){ |
Stack新增peek方法
傳回 Stack 頂端的物件而不需移除它。

(圖片來自於visualgo)
- 檢查
head是否為空,如果是,則返回null - 否則回傳
head的值
peek() { |
實戰
題目說明
給定一個僅包含字符 '('、')'、'{'、'}'、'[' 和 ']' 的字符串 s,確定輸入字符串是否有效。
如果滿足以下條件,則輸入字符串有效:
- 開括號必須由相同類型的括號閉合。
- 打開的括號必須以正確的順序關閉。
- 每個閉括號都有一個對應的相同類型的開括號。

實戰
- 數組
opened和closed被定義為分別表示左括號和右括號。 然後將字符串s轉換為稱為sarray的字符數組,並使用for循環遍歷sarray。 - 在循環的每次迭代中,檢查當前字符以查看它是否是左括號之一
- 如果是則將
opened數組中的相應索引推送到stack數組中 - 如果不是,則當前字符必須是右括號
- 如果
stack不為空,則檢查stack數組的最後一個元素,看它是否等於closed數組中的相應索引 - 如果等於相對應索引,則
stack數組的最後一個元素pop出來(因為已找到匹配的括號並且可以將其刪除) - 如果不是,函數返回
false - 最後再檢查stack是否為空,空則返回
true表示有效,否則反之
/** |
[name=@joe94113] [time=Tue, Feb 5, 2023 10:00 PM] [color=#907bf7]
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Joeの小屋!
評論
ValineDisqus



