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 相关文章推荐
PHP简单系统查询模块代码打包下载
Jun 07 PHP
php imagecreatetruecolor 创建高清和透明图片代码小结
May 15 PHP
php生成局部唯一识别码LUID的代码
Oct 06 PHP
精美漂亮的php分页类代码
Apr 02 PHP
通过table标签,PHP输出EXCEL的实现方法
Jul 24 PHP
php共享内存段示例分享
Jan 20 PHP
PHP对象相互引用的内存溢出实例分析
Aug 28 PHP
php 批量查询搜狗sogou代码分享
May 17 PHP
php断点续传之文件分割合并详解
Dec 13 PHP
在Yii2特定页面如何禁用调试工具栏Debug Toolbar详解
Aug 07 PHP
Laravel中前端js上传图片到七牛云的示例代码
Sep 04 PHP
php如何把表单内容提交到数据库
Jul 08 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小型企业库存管理系统的设计与实现代码
2011/05/16 PHP
PHP运行环境配置与开发环境的配置(图文教程)
2013/06/04 PHP
phpmyadmin配置文件现在需要绝密的短密码(blowfish_secret)的2种解决方法
2014/05/07 PHP
详解WordPress中给链接添加查询字符串的方法
2015/12/18 PHP
tp5递归 无限级分类详解
2019/10/18 PHP
学习ExtJS border布局
2009/10/08 Javascript
前端开发部分总结[兼容性、DOM操作、跨域等](持续更新)
2010/03/04 Javascript
前台js改变Session的值(用ajax实现)
2012/12/28 Javascript
jQuery登陆判断简单实现代码
2013/04/21 Javascript
Jquery uploadify图片上传插件无法上传的解决方法
2013/12/16 Javascript
jQuery中bind,live,delegate与one方法的用法及区别解析
2013/12/30 Javascript
JavaScript关闭当前页面(窗口)不带任何提示
2014/03/26 Javascript
jQuery操作元素css样式的三种方法
2014/06/04 Javascript
JS实现点击按钮控制Div变宽、增高及调整背景色的方法
2015/08/05 Javascript
轻松搞定jQuery.noConflict()
2016/02/15 Javascript
原生javascript运动函数的封装示例【匀速、抛物线、多属性的运动等】
2020/02/23 Javascript
Element Rate 评分的使用方法
2020/07/27 Javascript
JavaScript实现多球运动效果
2020/09/07 Javascript
在Python中操作列表之List.append()方法的使用
2015/05/20 Python
详解appium+python 启动一个app步骤
2017/12/20 Python
Python 用matplotlib画以时间日期为x轴的图像
2019/08/06 Python
pyMySQL SQL语句传参问题,单个参数或多个参数说明
2020/06/06 Python
PyCharm设置注释字体颜色以及是否倾斜的操作
2020/09/16 Python
微信html5页面调用第三方位置导航的示例
2018/03/14 HTML / CSS
canvas像素点操作之视频绿幕抠图
2018/09/11 HTML / CSS
腾讯技术类校园招聘笔试试题
2014/05/06 面试题
Java程序员常见面试题
2015/07/16 面试题
银行批评与自我批评
2014/02/10 职场文书
管理失职检讨书
2014/02/12 职场文书
英语故事演讲稿
2014/04/29 职场文书
户籍证明书标准模板
2014/09/10 职场文书
中学生2014国庆节演讲稿:不屈的民族
2014/09/21 职场文书
博士导师推荐信
2015/03/25 职场文书
病假证明模板
2015/06/19 职场文书
小学运动会前导词
2015/07/20 职场文书
零基础学java之带参数以及返回值的方法
2022/04/10 Java/Android