当前位置:首页 > PHP

php实现一个双向队列

2026-01-28 21:43:35PHP

PHP 实现双向队列

双向队列(Deque)是一种允许在队列两端进行插入和删除操作的线性数据结构。PHP 可以通过数组或 SplDoublyLinkedList 类实现双向队列。

php实现一个双向队列

使用数组实现双向队列

数组是 PHP 中最基础的数据结构,可以通过 array_pusharray_poparray_shiftarray_unshift 实现双向队列的基本操作。

php实现一个双向队列

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() {
        if ($this->isEmpty()) {
            return null;
        }
        return array_shift($this->queue);
    }

    // 从队尾删除元素
    public function removeRear() {
        if ($this->isEmpty()) {
            return null;
        }
        return array_pop($this->queue);
    }

    // 检查队列是否为空
    public function isEmpty() {
        return empty($this->queue);
    }

    // 获取队列大小
    public function size() {
        return count($this->queue);
    }
}

使用 SplDoublyLinkedList 实现双向队列

PHP 的 SPL(标准 PHP 库)提供了 SplDoublyLinkedList 类,可以高效地实现双向队列。

class Deque {
    private $list;

    public function __construct() {
        $this->list = new SplDoublyLinkedList();
    }

    // 从队首插入元素
    public function addFront($item) {
        $this->list->unshift($item);
    }

    // 从队尾插入元素
    public function addRear($item) {
        $this->list->push($item);
    }

    // 从队首删除元素
    public function removeFront() {
        if ($this->isEmpty()) {
            return null;
        }
        return $this->list->shift();
    }

    // 从队尾删除元素
    public function removeRear() {
        if ($this->isEmpty()) {
            return null;
        }
        return $this->list->pop();
    }

    // 检查队列是否为空
    public function isEmpty() {
        return $this->list->isEmpty();
    }

    // 获取队列大小
    public function size() {
        return $this->list->count();
    }
}

示例用法

$deque = new Deque();
$deque->addFront(1);   // 队列: [1]
$deque->addRear(2);    // 队列: [1, 2]
$deque->addFront(3);   // 队列: [3, 1, 2]

echo $deque->removeFront(); // 输出 3
echo $deque->removeRear();  // 输出 2

性能比较

  • 数组实现:简单直观,但在队首插入或删除元素时,array_unshiftarray_shift 的时间复杂度为 O(n),因为需要重新索引数组。
  • SplDoublyLinkedList 实现:操作的时间复杂度均为 O(1),性能更高,适合频繁的双端操作。

如果需要高性能的双向队列,推荐使用 SplDoublyLinkedList

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

相关文章

实现vue双向绑定

实现vue双向绑定

Vue 双向绑定的实现原理 Vue 的双向绑定主要通过 v-model 指令实现,其核心是结合数据劫持(Object.defineProperty 或 Proxy)和发布-订阅模式。以下是具体实现机制…

vue队列实现播放

vue队列实现播放

Vue 队列播放实现方法 在 Vue 中实现队列播放功能,可以通过以下方式完成: 使用数组管理队列 定义一个数组来存储待播放的项目,利用数组的 push 和 shift 方法实现队列的先进先出特性。…

vue实现双向滚动

vue实现双向滚动

实现双向滚动的 Vue 方法 双向滚动通常指两个关联的滚动区域(如表格的头部和内容部分)同步滚动。以下是几种实现方式: 使用事件监听和 scroll 方法 通过监听一个滚动区域的 scroll 事件…

vue 实现双向绑定

vue 实现双向绑定

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

vue双向绑定的实现

vue双向绑定的实现

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

vue双向绑定实现案例

vue双向绑定实现案例

Vue 双向绑定实现案例 Vue 的双向绑定通过 v-model 指令实现,结合了数据绑定和事件监听。以下是几种常见场景的实现案例: 基础输入框绑定 <template> <i…