php实现一个双向队列
使用 SplDoublyLinkedList 实现双向队列
PHP 的 SPL(Standard PHP Library)提供了 SplDoublyLinkedList 类,可以高效实现双向队列。该类原生支持从头部或尾部插入/删除元素。
$deque = new SplDoublyLinkedList();
// 尾部插入
$deque->push('Tail Item');
// 头部插入
$deque->unshift('Head Item');
// 尾部删除
$tail = $deque->pop();
// 头部删除
$head = $deque->shift();
// 设置迭代模式(正向遍历)
$deque->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO);
// 遍历队列
foreach ($deque as $item) {
echo $item . PHP_EOL;
}
使用数组模拟双向队列
如果环境不支持 SPL,可以用数组配合 array_shift 和 array_pop 模拟:
$deque = [];
// 尾部插入
array_push($deque, 'Tail Item');
// 头部插入
array_unshift($deque, 'Head Item');
// 尾部删除
$tail = array_pop($deque);
// 头部删除
$head = array_shift($deque);
// 遍历队列
foreach ($deque as $item) {
echo $item . PHP_EOL;
}
自定义双向队列类
封装一个可复用的双向队列类:
class Deque {
private $queue = [];
public function addFront($item) {
array_unshift($this->queue, $item);
}
public function addRear($item) {
array_push($this->queue, $item);
}
public function removeFront() {
return array_shift($this->queue);
}
public function removeRear() {
return array_pop($this->queue);
}
public function isEmpty() {
return empty($this->queue);
}
public function size() {
return count($this->queue);
}
}
// 使用示例
$deque = new Deque();
$deque->addFront('Front');
$deque->addRear('Rear');
echo $deque->removeFront(); // 输出 Front
性能注意事项
- SPL 实现比数组操作更高效,特别是在处理大量数据时
- 数组实现的头部操作(
array_unshift/array_shift)会导致重新索引,时间复杂度为 O(n) - 对于高频队列操作场景,建议使用 SPL 实现
线程安全考虑
PHP 默认是单线程运行模型,若在多进程/多线程环境下(如 Swoole),需要额外加锁机制:

$deque = new SplDoublyLinkedList();
$lock = new Swoole\Lock();
// 安全插入
$lock->lock();
$deque->push($data);
$lock->unlock();






