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 相关文章推荐
在任意字符集下正常显示网页的方法二(续)
Apr 01 PHP
CentOS 6.2使用yum安装LAMP以及phpMyadmin详解
Jun 17 PHP
php通过Chianz.com获取IP地址与地区的方法
Jan 14 PHP
php和editplus正则表达式去除空白行
Apr 17 PHP
php简单创建zip压缩文件的方法
Apr 30 PHP
CodeIgniter连贯操作的底层原理分析
May 17 PHP
PHP QRCODE生成彩色二维码的方法
May 19 PHP
php foreach如何跳出两层循环(详解)
Nov 05 PHP
php解决DOM乱码的方法示例代码
Nov 20 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
Jan 16 PHP
Laravel5.5 数据库迁移:创建表与修改表示例
Oct 23 PHP
Docker 安装 PHP并与Nginx的部署实例讲解
Feb 27 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
PHP实现Socket服务器的代码
2008/04/03 PHP
PHP的博客ping服务代码
2012/02/04 PHP
Win下如何安装PHP的APC拓展
2013/08/07 PHP
IE浏览器中图片onload事件无效的解决方法
2014/04/29 Javascript
Windows8下搭建Node.js开发环境教程
2014/09/03 Javascript
jQuery中:checked选择器用法实例
2015/01/04 Javascript
node.js [superAgent] 请求使用示例
2015/03/13 Javascript
js实现的Easy Tabs选项卡用法实例
2015/09/06 Javascript
JavaScript驾驭网页-DOM
2016/03/24 Javascript
js操作数据库实现注册和登陆的简单实例
2016/05/26 Javascript
AngularJS服务service用法总结
2016/12/13 Javascript
js实现用户输入的小写字母自动转大写字母的方法
2017/01/21 Javascript
js实现数字滚动特效
2019/12/16 Javascript
Python+Selenium自动化实现分页(pagination)处理
2017/03/31 Python
Python字符串中添加、插入特定字符的方法
2019/09/10 Python
pytorch中torch.max和Tensor.view函数用法详解
2020/01/03 Python
pip install 使用国内镜像的方法示例
2020/04/03 Python
解决Keras自带数据集与预训练model下载太慢问题
2020/06/12 Python
Python可以用来做什么
2020/11/23 Python
Laura Mercier官网:彩妆大师罗拉玛斯亚的化妆品牌
2018/01/04 全球购物
The Outnet亚太地区:折扣设计师时装店
2019/12/05 全球购物
澳大利亚领先的男装零售连锁店:Lowes
2020/08/07 全球购物
汽车检测与维修专业求职信
2013/10/30 职场文书
自我鉴定书面格式
2014/01/13 职场文书
保安岗位职责
2014/02/21 职场文书
班主任个人工作反思
2014/04/28 职场文书
求职信模板
2014/05/23 职场文书
励志演讲稿3分钟
2014/08/21 职场文书
励志演讲稿大全
2014/08/21 职场文书
永远跟党走演讲稿
2014/09/12 职场文书
2015年新教师工作总结
2015/04/28 职场文书
如何计划开一家便利店?
2019/07/31 职场文书
详解Python魔法方法之描述符类
2021/05/26 Python
Vue + iView实现Excel上传功能的完整代码
2021/06/22 Vue.js
Python Flask搭建yolov3目标检测系统详解流程
2021/11/07 Python
教你部署vue项目到docker
2022/04/05 Vue.js