当前位置:首页 > 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 的双向绑定主要通过数据劫持结合发布者-订阅者模式实现,核心是 Object.defineProperty(Vue 2.x)或 Proxy(Vue 3.x)。 数据…

vue简单实现双向绑定

vue简单实现双向绑定

Vue 双向绑定的简单实现 Vue 的双向绑定核心是通过 v-model 指令实现的,它结合了 v-bind 和 v-on 的功能。以下是一个简单的实现方式: 模板部分 <template&…

vue中实现双向数据

vue中实现双向数据

Vue 中实现双向数据绑定的方法 使用 v-model 指令 v-model 是 Vue 提供的语法糖,用于在表单元素上实现双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素的值。 <…

vue如何实现双向变电

vue如何实现双向变电

Vue 双向绑定实现方法 Vue 中实现双向绑定的核心是通过 v-model 指令,它结合了 v-bind 和 v-on 的功能,简化了表单元素与数据的同步操作。 基础用法 在表单元素上直接使用 v…

vue实现数据双向绑定

vue实现数据双向绑定

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

vue底层实现双向绑定

vue底层实现双向绑定

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