当前位置:首页 > PHP

php实现一个双向队列

2026-04-03 03:28:37PHP

使用 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_shiftarray_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),需要额外加锁机制:

php实现一个双向队列

$deque = new SplDoublyLinkedList();
$lock = new Swoole\Lock();

// 安全插入
$lock->lock();
$deque->push($data);
$lock->unlock();

标签: 队列双向
分享给朋友:

相关文章

vue实现队列消息

vue实现队列消息

Vue 实现队列消息 在 Vue 中实现队列消息功能,可以通过以下方法实现一个简单的消息队列系统,用于显示和管理临时通知(如成功、错误提示)。 使用 Vuex 管理消息队列 创建一个 Vuex st…

vue双向绑定原理实现

vue双向绑定原理实现

Vue 双向绑定原理实现 Vue 的双向绑定核心是通过数据劫持结合发布-订阅模式实现的,主要依赖 Object.defineProperty(Vue 2.x)或 Proxy(Vue 3.x)来监听数据…

vue自己实现双向绑定

vue自己实现双向绑定

实现 Vue 双向绑定的核心原理 双向绑定的核心是通过数据劫持结合发布-订阅模式实现的。主要涉及 Object.defineProperty 或 Proxy 来监听数据变化,并通过观察者模式通知视图更…

vue双向数据怎么实现

vue双向数据怎么实现

Vue 双向数据绑定的实现 Vue 的双向数据绑定主要通过 v-model 指令实现,结合数据劫持(Object.defineProperty 或 Proxy)和发布-订阅模式完成数据与视图的同步更新…

vue实现数据双向绑定

vue实现数据双向绑定

Vue 数据双向绑定的实现原理 Vue 的数据双向绑定主要通过 v-model 指令实现,其核心是基于数据劫持和发布-订阅模式。以下是关键实现机制: 数据劫持(响应式原理) Vue 使用 Objec…

react如何双向数据绑定

react如何双向数据绑定

双向数据绑定的实现方法 React 本身是单向数据流的设计理念,但可以通过以下方式实现类似双向数据绑定的效果: 受控组件方式 通过 value 和 onChange 事件实现双向绑定: f…