SplStack 繼承 SplDoublyLinkedList,將迭代器模式設為 IT_MODE_LIFO(後進先出),即得標準堆疊行為。
SplStack extends SplDoublyLinkedList
// 繼承所有雙向鏈表方法
// push() = 入堆
// pop() = 出堆
// top() = 看堆頂
// bottom() = 看堆底
// setIteratorMode(IT_MODE_LIFO | IT_MODE_KEEP/DELETE)
<?php
$stack = new SplStack();
// 入堆
$stack->push('a');
$stack->push('b');
$stack->push('c'); // 堆頂為 'c'
// 看堆頂(不移除)
echo $stack->top(); // c
// 出堆
echo $stack->pop(); // c
echo $stack->pop(); // b
// 迭代(預設 LIFO + KEEP,迭代後資料保留)
foreach ($stack as $item) {
echo $item . PHP_EOL; // a
}
// 設定迭代模式:LIFO + DELETE(迭代時消耗)
$stack->setIteratorMode(SplDoublyLinkedList::IT_MODE_LIFO | SplDoublyLinkedList::IT_MODE_DELETE);
foreach ($stack as $item) {
echo $item; // a
}
echo $stack->count(); // 0
| 特性 | SplStack | SplDoublyLinkedList |
|---|---|---|
| 預設迭代模式 | LIFO (堆疊) | FIFO (佇列) |
| 語意 | 僅允許 LIFO 操作 | 雙向操作(push/pop/shift/unshift) |
| offsetSet(0, $val) | 修改堆頂元素 | 修改索引 0(堆底) |
<?php
// 括號匹配驗證
function bracketsOk($str) {
$stack = new SplStack();
$pairs = ['('=>')', '['=>']', '{'=>'}'];
foreach (str_split($str) as $ch) {
if (isset($pairs[$ch])) {
$stack->push($ch);
} elseif (in_array($ch, $pairs)) {
if ($stack->isEmpty()) return false;
$open = $stack->pop();
if ($pairs[$open] !== $ch) return false;
}
}
return $stack->isEmpty();
}
var_dump(bracketsOk('({[]})')); // true
var_dump(bracketsOk('({[})')); // false
push/pop/top:**O(1)**,尾部操作無位移開銷SplFixedArray 模擬堆疊,記憶體更省