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版(3)
Oct 09 PHP
PHP开发中四种查询返回结果分析
Jan 02 PHP
优化php效率,提高php性能的一些方法
Mar 24 PHP
深入PHP获取随机数字和字母的方法详解
Jun 06 PHP
php禁止直接从浏览器输入地址访问.php文件的方法
Nov 04 PHP
php实现仿写CodeIgniter的购物车类
Jul 29 PHP
PHP判断FORM表单或URL参数来的数据是否为整数的方法
Mar 25 PHP
PHP图片加水印实现方法
May 06 PHP
今天你说520了吗?不仅有php表白书还有java表白神器
May 20 PHP
php解决和避免form表单重复提交的几种方法
Aug 31 PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
Jun 19 PHP
如何判断微信付款码和支付宝付款码
Apr 01 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
for循环连续求和、九九乘法表代码
2012/02/20 PHP
PHP用星号隐藏部份用户名、身份证、IP、手机号等实例
2014/04/08 PHP
yii实现创建验证码实例解析
2014/07/31 PHP
thinkphp区间查询、统计查询与SQL直接查询实例分析
2014/11/24 PHP
PHP实现图片批量打包下载功能
2017/03/01 PHP
linux mint下安装phpstorm2020包括JDK部分的教程详解
2020/09/17 PHP
javascript结合ajax读取txt文件内容
2014/12/05 Javascript
jquery实现Ctrl+Enter提交表单的方法
2015/07/21 Javascript
text-align:justify实现文本两端对齐 兼容IE
2015/08/19 Javascript
jQuery使用ajax方法解析返回的json数据功能示例
2017/01/10 Javascript
JavaScript闭包和回调详解
2017/08/09 Javascript
轻量级JS Cookie插件js-cookie的使用方法
2018/03/22 Javascript
cnpm加速Angular项目创建的方法
2018/09/07 Javascript
Vue递归实现树形菜单方法实例
2018/11/06 Javascript
JavaScript设计模式之观察者模式实例详解
2019/01/16 Javascript
JavaScript 监听组合按键思路及代码实现
2020/07/28 Javascript
Python re模块介绍
2014/11/30 Python
Python内置函数Type()函数一个有趣的用法
2015/02/18 Python
Python探索之实现一个简单的HTTP服务器
2017/10/28 Python
pandas删除行删除列增加行增加列的实现
2019/07/06 Python
详解pandas数据合并与重塑(pd.concat篇)
2019/07/09 Python
Atom Python 配置Python3 解释器的方法
2019/08/28 Python
python中利用matplotlib读取灰度图的例子
2019/12/07 Python
Pytorch mask_select 函数的用法详解
2020/02/18 Python
基于python计算并显示日间、星期客流高峰
2020/05/07 Python
matplotlib 画双轴子图无法显示x轴的解决方法
2020/07/27 Python
Biblibili视频投稿接口分析并以Python实现自动投稿功能
2021/02/05 Python
HTML5实时语音通话聊天MP3压缩传输3KB每秒
2019/08/28 HTML / CSS
ALEX AND ANI:手镯,项链,耳环和更多
2017/04/20 全球购物
可口可乐唇膏:Lip Smackers
2019/08/27 全球购物
考博专家推荐信模板
2013/12/02 职场文书
2014年保卫工作总结
2014/12/05 职场文书
秦兵马俑导游词
2015/02/02 职场文书
筑梦中国心得体会
2016/01/18 职场文书
《将心比心》教学反思
2016/02/23 职场文书
pytorch实现线性回归以及多元回归
2021/04/11 Python