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中的CMS的涵义
Mar 11 PHP
PHP6 mysql连接方式说明
Feb 09 PHP
关于PHP语言构造器介绍
Jul 08 PHP
PHP IE中下载附件问题解决方法
Jan 07 PHP
PHP实现获取FLV文件的时间
Feb 10 PHP
非常经典的PHP文件上传类分享
May 15 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
May 23 PHP
Laravel的throttle中间件失效问题解决方法
Oct 09 PHP
PHP错误和异常处理功能模块示例
Nov 12 PHP
浅谈PHP中new self()和new static()的区别
Aug 11 PHP
PHP实现的超长文本分页显示功能示例
Jun 04 PHP
PHP7变量处理机制修改
Mar 09 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显示时间常用方法小结
2015/06/05 PHP
PHP的Socket通信之UDP通信实例
2015/07/02 PHP
PHP入门教程之字符串处理技巧总结(转换,过滤,解析,查找,截取,替换等)
2016/09/11 PHP
详解PHP中foreach的用法和实例
2016/10/25 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
JavaScript入门学习书籍推荐
2008/06/12 Javascript
jQuery 性能优化指南(3)
2009/05/21 Javascript
Javascript的各种节点操作实例演示代码
2012/06/27 Javascript
基于jQuery.Validate验证库知识点的详解
2013/04/26 Javascript
jQuery快速上手:写jQuery与直接写JS的区别详细解析
2013/08/26 Javascript
js菜单点击显示或隐藏效果的简单实例
2014/01/13 Javascript
使用javascript为网页增加夜间模式
2014/01/26 Javascript
ES6新特性七:数组的扩充详解
2017/04/21 Javascript
详解使用路由延迟加载 Angular 模块
2017/10/12 Javascript
javascript变量提升和闭包理解
2018/03/12 Javascript
Vue SPA单页应用首屏优化实践
2018/06/28 Javascript
vue+axios+mock.js环境搭建的方法步骤
2018/08/28 Javascript
使用VScode 插件debugger for chrome 调试react源码的方法
2019/09/13 Javascript
微信小程序实现Swiper轮播图效果
2019/11/22 Javascript
python读取Android permission文件
2013/11/01 Python
python中split方法用法分析
2015/04/17 Python
200行自定义python异步非阻塞Web框架
2017/03/15 Python
使用pandas批量处理矢量化字符串的实例讲解
2018/07/10 Python
python 3.6.4 安装配置方法图文教程
2018/09/18 Python
Pandas之排序函数sort_values()的实现
2019/07/09 Python
python正则表达式匹配不包含某几个字符的字符串方法
2019/07/23 Python
Python大数据之使用lxml库解析html网页文件示例
2019/11/16 Python
在Python中使用MongoEngine操作数据库教程实例
2019/12/03 Python
解决Python logging模块无法正常输出日志的问题
2020/02/21 Python
keras打印loss对权重的导数方式
2020/06/10 Python
英国网上花店:Bunches
2016/11/29 全球购物
库房主管岗位职责
2013/12/31 职场文书
给老婆的检讨书
2015/01/27 职场文书
杭白菊导游词
2015/02/10 职场文书
周一给客户的问候语
2015/11/10 职场文书
《兰兰过桥》教学反思
2016/02/20 职场文书