PHP如何通过带尾指针的链表实现'队列'


Posted in PHP onOctober 22, 2020

这篇文章是展示通过 PHP 语言实现一种带 尾指针 的链表,然后通过链表来实现队列,其中链表的头元素 head 是用于列队 出队 的,它的时间复杂度 O(1) ,若在 head 的基础上实现链表尾部 入队 时间度为 O(n),为了降低入队操作的时间复杂度,可以给链表维护一个带有尾指针的变量 tail ,这样每次入队的时候直接操作 tail ,出队的时候直接操作 head ,这样可以使得 入队 出队 时间复杂度都是 O(1)。

1.output_queue_by_liked_list.php

这是一个演示打印输出结果的文件:

<?php
require 'QueueByLinkedList.php';
$queue = new QueueByLinkedList();
$queue->enqueue("rr"); //入队
$queue->enqueue("tt"); //入队
$queue->enqueue("yy"); //入队
$queue->enqueue("uu"); //入队
$queue->enqueue("ii"); //入队
$queue->enqueue("oo"); //入队
echo $queue->toString(); //打印 rr->tt->yy->uu->ii->oo->null
echo "<br>";
echo $queue->dequeue(); //出队 打印 rr
echo "<br>";
echo $queue->dequeue(); //出队 打印 tt
echo "<br>";
echo $queue->dequeue(); //出队 打印 yy
echo "<br>";
echo $queue->toString(); //打印 uu->ii->oo->null
echo "<br>";
$queue->enqueue("11"); //入队
$queue->enqueue("22"); //入队
$queue->enqueue("33"); //入队
$queue->enqueue("44"); //入队
$queue->enqueue("55"); //入队
$queue->enqueue("66"); //入队
echo "<br>";
echo $queue->toString(); //打印 uu->ii->oo->11->22->33->44->55->66->null

2.QueueByLinkedList 类

这是通过带尾指针链表实现的 队列 类,它里面有  入队(enqueue) 方法和  出队(dequque) 方法 :

<?php
require 'Queue.php';
/**
 * 带有尾指针的链表
 * Class LinkedListTail
 */
class QueueByLinkedList implements Queue
{
  private $head; //链表头部
  private $tail; //链表尾部
  private $size; //链表大小
  /**
   * 构造函数 初始化链表
   * QueueByLinkedList constructor.
   */
  public function __construct() {
    $this->head = null;
    $this->tail = null;
    $this->size = 0;
  }
  /**
   * 入队操作
   * @param $e
   */
  public function enqueue($e): void {
    if ($this->tail == null) {
      $this->tail = $this->head = new Node($e, null);
    } else {
      $node = new Node($e, null);
      $this->tail->next = $node;
      $this->tail = $node;
    }
    $this->size++;
  }
  /**
   * 出队操作
   * @return mixed
   */
  public function dequeue() {
    if ($this->size == 0) {
      return "队列已经是空的";
    }
    $node = $this->head;
    $this->head = $node->next;
    $this->size--;
    if ($node->next == null) {
      $this->tail = null;
    }
    return $node->e;
  }
  public function getFront() {
    if ($this->size == 0) {
      return "队列已经是空的";
    }
    return $this->head->e;
  }
  public function getSize() {
    return $this->size;
  }
  /**
   * 判断队列是否为空
   * @return bool
   */
  public function isEmpty(): bool {
    return $this->size == 0;
  }
  public function toString() {
    $str = "";
    for ($node = $this->head; $node != null; $node = $node->next) {
      $str .= $node->e . "->";
    }
    $str .= "null";
    return $str;
  }
}
class Node
{
  public $e;//节点元素
  public $next; //下个节点信息
  /**
   * 构造函数 设置节点信息
   * Node constructor.
   * @param $e
   * @param $next
   */
  public function __construct($e, $next) {
    $this->e = $e;
    $this->next = $next;
  }
}

3.interface Queue

这里是 队列 类一个实现接口,里面定义了一些函数,继承它之后,必须重构里面的所有方法:

<?php
interface Queue
{
  public function enqueue($e): void;//入队
  public function dequeue();//出队
  public function getFront();//获取前端元素
  public function getSize();//获取队列大小
  public function isEmpty();//判断队列是否为空
}

以上就是PHP如何通过带尾指针的链表实现'队列'的详细内容,更多关于PHP 实现队列的资料请关注三水点靠木其它相关文章!

PHP 相关文章推荐
excellent!――ASCII Art(由目标图象生成ascii)
Feb 20 PHP
LotusPhp笔记之:Logger组件的使用方法
May 06 PHP
php教程之phpize使用方法
Feb 12 PHP
thinkphp在模型中自动完成session赋值示例代码
Sep 09 PHP
PHP快速生成各种信息提示框的方法
Feb 03 PHP
PHP处理数组和XML之间的互相转换
Jun 02 PHP
PHP中session跨子域的三种实现方法
Jul 25 PHP
PHP通过加锁实现并发情况下抢码功能
Aug 10 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
Jun 27 PHP
php+javascript实现的动态显示服务器运行程序进度条功能示例
Aug 07 PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
Oct 07 PHP
Git命令之分支详解
Mar 02 PHP
php使用event扩展的io复用测试的示例
Oct 20 #PHP
Aliyun Linux 编译安装 php7.3 tengine2.3.2 mysql8.0 redis5的过程详解
Oct 20 #PHP
phpcmsv9.0任意文件上传漏洞解析
Oct 20 #PHP
php实现记事本案例
Oct 20 #PHP
Laravel统一错误处理为JSON的方法介绍
Oct 18 #PHP
Yii中特殊行为ActionFilter的使用方法示例
Oct 18 #PHP
PHP 99乘法表的几种实现代码
Oct 13 #PHP
You might like
sqlyog 中文乱码问题的设置方法
2008/10/19 PHP
如何用C语言编写PHP扩展的详解
2013/06/13 PHP
php支持断点续传、分块下载的类
2016/05/02 PHP
PHP 观察者模式深入理解与应用分析
2019/09/25 PHP
js和jquery对dom节点的操作(创建/追加)
2013/04/21 Javascript
在js文件中写el表达式取不到值的原因及解决方法
2013/12/23 Javascript
js 显示base64编码的二进制流网页图片
2014/04/04 Javascript
不同编码的页面表单数据乱码问题解决方法
2015/02/15 Javascript
AngularJS ng-change 指令的详解及简单实例
2016/07/30 Javascript
Jquery Easyui选项卡组件Tab使用详解(10)
2016/12/18 Javascript
在一个页面重复使用一个js函数的方法详解
2016/12/26 Javascript
微信小程序实现图片自适应(支持多图)
2017/01/25 Javascript
React Native 真机断点调试+跨域资源加载出错问题的解决方法
2018/01/18 Javascript
基于html+css+js实现简易计算器代码实例
2020/02/28 Javascript
解决vux 中popup 组件Mask 遮罩在最上层的问题
2020/11/03 Javascript
[09:40]DAC2018 4.5 SOLO赛 MidOne vs Miracle
2018/04/06 DOTA
Python学习资料
2007/02/08 Python
Python实现的选择排序算法原理与用法实例分析
2017/11/22 Python
PyTorch快速搭建神经网络及其保存提取方法详解
2018/04/28 Python
python中pytest收集用例规则与运行指定用例详解
2019/06/27 Python
浅析PyTorch中nn.Linear的使用
2019/08/18 Python
Python在OpenCV里实现极坐标变换功能
2019/09/02 Python
简单了解python元组tuple相关原理
2019/12/02 Python
使用CSS实现弹性视频html5案例实践
2012/12/26 HTML / CSS
世界上最大的专业美容用品零售商:Sally Beauty
2017/07/02 全球购物
温泉秘密:Onsen Secret
2020/07/06 全球购物
护士岗前培训自我评鉴
2014/02/28 职场文书
舞蹈专业求职信
2014/06/13 职场文书
模具设计与制造专业求职信
2014/07/19 职场文书
领导党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
个人工作作风整改措施思想汇报
2014/10/13 职场文书
毕业实习指导教师评语
2014/12/31 职场文书
环保宣传语大全
2015/07/13 职场文书
SQL实现LeetCode(178.分数排行)
2021/08/04 MySQL
php将xml转化对象的实例详解
2021/11/17 PHP
浅谈Node的内存泄露问题
2022/05/06 NodeJs