陣列與線性結構

堆疊

堆疊是一種你只能碰到頂部的集合,就像一疊盤子:新盤子放在頂上,要拿也只能拿最上面那個。最後進去的最先出來——這叫做 LIFO,後進先出。兩個核心動作是 push(壓入頂部)和 pop(彈出頂部);peek 則只看頂部而不取走。

因為所有操作都集中在一端,堆疊很便宜:push 和 pop 都是 O(1)。你可以用動態陣列實作它(push 即追加、pop 即刪末尾),也可以用鏈結串列(在頭部 push/pop)。C++ 提供了現成的封裝 std::stack。它故意沒有快速觸及中間的辦法——這個限制正是要點,它讓結構保持簡單而快速。

留意之後你會發現堆疊無處不在。呼叫堆疊記錄著誰呼叫了誰、以及如何返回;復原歷史會彈出最近一次操作;括號配對、運算式求值,以及深度優先搜尋中的回溯,都靠一個堆疊來記住該回到哪裡。

#include <stack>
std::stack<int> s;
s.push(1); s.push(2); s.push(3);
//  top -> | 3 |
//         | 2 |
//         | 1 |   (bottom)
int t = s.top();   // 3   (peek, O(1))
s.pop();           // removes 3, O(1)
// now top() == 2

LIFO 順序;push 與 pop 都是 O(1)。

作為資料結構的堆疊,與執行程式的呼叫堆疊不是一回事——但呼叫堆疊本身就是一個堆疊,名字因此共用。

又稱
LIFOLIFO stack堆栈堆疊後進先出