我們想像桌上疊著幾本書:要放一本新書時,通常放在最上面;要拿書時,也先拿最上面的那一本。中間的書不能直接拿出來,必須先移開壓在上面的書。
堆疊(stack)就是依照類似規則管理資料的方式:資料從同一端放入,也從同一端取出。這一端稱為堆疊頂端(top)。
堆疊遵守後進先出(Last In, First Out, LIFO):最後放進去的資料會最先被取出。
例如依序放入 A、B、C,C 最後放入,因此會最先取出;A 最早放入,會最後取出:

可以把它想成只能從頂端操作的一疊書。若想拿出底下的 A,必須先拿走 C 和 B。堆疊的順序不是依照資料的大小或名稱決定,而是由放入和取出的先後順序決定。
pushpush 是把新資料放到堆疊頂端。假設堆疊原本有 A、B,再執行 push(C),C 會成為新的頂端:

新資料永遠加在頂端,所以原本的資料順序仍然保留,只是頂端換成新資料。
poppop 會移除並取出目前頂端的資料。若堆疊是 A、B、C,執行一次 pop 會取出 C,B 隨即成為新的頂端:

pop 不只是讀取頂端資料,也會讓那筆資料離開堆疊。之後再執行 pop,取出的才會是 B。
peekpeek 用來查看目前頂端的資料,但不移除它。對 A、B、C 執行 peek,結果是 C,查看後堆疊仍然是 A、B、C:

因此,pop 和 peek 的差別在於:pop 會取出並移除頂端資料;peek 只查看資料,堆疊內容不變。
如果堆疊裡沒有任何資料,仍然呼叫 pop 或 peek,就沒有頂端資料可以取出或查看。這種對空堆疊執行 pop 或 peek 的錯誤稱為下溢(underflow)。實際操作前要先確認堆疊不是空的,才能安全地取出或查看頂端資料。
當一件事需要依照「最近發生的先處理」的順序進行,堆疊就很適合。例如使用復原功能時,通常會先取消最近一次的操作,再往前取消更早的操作。這和堆疊最後放入的操作先被取出的順序相同。
堆疊只從頂端放入和取出資料,因此形成後進先出的順序。理解每個操作是否會改變堆疊,就能分清楚 push、pop 和 peek 的用途;操作空堆疊前,也要留意下溢問題。
今日重點:
push 把資料放到頂端;pop 移除並取出頂端資料。peek 只查看頂端,不會移除資料。pop 或 peek;對空堆疊執行這兩個操作會造成下溢。下一篇將認識佇列,看看資料如何依照「先進先出」的順序進出。