当前位置: 首页 > article >正文

PHP实现双向队列

在 PHP 中,虽然标准库没有直接提供一个双向队列(Deque)的实现,但我们可以使用 SplDoublyLinkedList 类来实现这一功能。SplDoublyLinkedList 是一个双向链表,它允许我们在列表的头部和尾部进行插入和删除操作,这符合双向队列的基本特性。

下面是一个使用 SplDoublyLinkedList 实现双向队列的示例代码:

<?php

class Deque {
    private $deque;

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

    // 在队列尾部添加元素
    public function enqueue($value) {
        $this->deque->push($value);
    }

    // 在队列头部添加元素(也可以看作是在队列的另一端添加)
    public function enqueueFront($value) {
        $this->deque->unshift($value);
    }

    // 从队列尾部移除元素
    public function dequeue() {
        if ($this->isEmpty()) {
            throw new UnderflowException("Deque is empty, cannot dequeue.");
        }
        return $this->deque->pop();
    }

    // 从队列头部移除元素(也可以看作是在队列的另一端移除)
    public function dequeueFront() {
        if ($this->isEmpty()) {
            throw new UnderflowException("Deque is empty, cannot dequeue from front.");
        }
        return $this->deque->shift();
    }

    // 获取队列头部的元素(不移除)
    public function peek() {
        if ($this->isEmpty()) {
            throw new UnderflowException("Deque is empty, cannot peek.");
        }
        return $this->deque->bottom();
    }

    // 获取队列尾部的元素(不移除)
    public function peekEnd() {
        if ($this->isEmpty()) {
            throw new UnderflowException("Deque is empty, cannot peek at end.");
        }
        return $this->deque->top();
    }

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

    // 获取队列中的元素数量
    public function count() {
        return $this->deque->count();
    }

    // 打印队列中的元素(用于调试)
    public function printDeque() {
        echo implode(' <-> ', $this->deque->toArray()) . "\n";
    }
}

// 示例用法
$deque = new Deque();
$deque->enqueue(1);
$deque->enqueue(2);
$deque->enqueueFront(0);
$deque->printDeque(); // 输出: 0 <-> 1 <-> 2
echo "Peek: " . $deque->peek() . "\n"; // 输出: Peek: 1
echo "Dequeue: " . $deque->dequeue() . "\n"; // 输出: Dequeue: 1
$deque->printDeque(); // 输出: 0 <-> 2
echo "Peek end: " . $deque->peekEnd() . "\n"; // 输出: Peek end: 2
echo "Dequeue front: " . $deque->dequeueFront() . "\n"; // 输出: Dequeue front: 0
$deque->printDeque(); // 输出: 2
?>

在这个示例中,Deque 类封装了一个 SplDoublyLinkedList 实例,并提供了标准的双向队列操作,如 enqueue(在尾部添加)、enqueueFront(在头部添加)、dequeue(从尾部移除)、dequeueFront(从头部移除)、peek(查看头部元素)、peekEnd(查看尾部元素)、isEmpty(检查是否为空)和 count(获取元素数量)。此外,还有一个 printDeque 方法用于打印队列中的元素,便于调试。

请注意,SplDoublyLinkedListpush 方法在尾部添加元素,unshift 方法在头部添加元素,pop 方法从尾部移除元素,而 shift 方法从头部移除元素。这些操作使得 SplDoublyLinkedList 非常适合用作双向队列的底层实现。


http://www.kler.cn/a/403910.html

相关文章:

  • shell--第一次作业
  • 【docker】docker commit 命令 将当前容器的状态保存为一个新的镜像
  • 7天掌握SQL - 第三天:MySQL实践与索引优化
  • 三种复制只有阅读权限的飞书网络文档的方法
  • VMAuthdService服务启动不了~
  • SpringBoot集成多个rabbitmq
  • C++结构型设计模式之适配器模式概述
  • HTML和CSS 表单、表格练习
  • es写入磁盘的过程以及相关优化
  • 极简AI工具箱网站开源啦!
  • vue3+elementui-plus el-dialog全局配置点击空白处不关闭弹窗
  • iOS屏幕共享技术实践
  • 【K8S问题系列 | 16】如何有效地监控资源使用情况并设置告警?
  • PAT甲级 1080 Graduate Admission(30)
  • 计算机网络-Python通信
  • 什么是Git,有什么特点
  • 51c自动驾驶~合集30
  • 【AI日记】24.11.19 GraphRAG
  • Python爬虫项目 | 二、每日天气预报
  • git上传文件到远程仓库
  • 【东莞石碣】戴尔R740服务器维修raid硬盘问题
  • KubeSphere 最佳实战:K8s 构建高可用、高性能 Redis 集群实战指南
  • Jenkins的环境部署
  • Linux常用命令之wc命令详解
  • PointNet++项目分析
  • JAVA篇之类和对象