陣列與線性結構
堆疊
堆疊是一種你只能碰到頂部的集合,就像一疊盤子:新盤子放在頂上,要拿也只能拿最上面那個。最後進去的最先出來——這叫做 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)。
作為資料結構的堆疊,與執行程式的呼叫堆疊不是一回事——但呼叫堆疊本身就是一個堆疊,名字因此共用。
又稱
另見