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作的文本留言本的例子(一)
Oct 09 PHP
Banner程序
Oct 09 PHP
PHP中10个不常见却非常有用的函数
Mar 21 PHP
IIS7.X配置PHP运行环境小结
Jun 09 PHP
PHP反转字符串函数strrev()函数的用法
Feb 04 PHP
优化PHP代码技巧的小结
Jun 02 PHP
ThinkPHP自动完成中使用函数与回调方法实例
Nov 29 PHP
PHP实现图片自动清理的方法
Jul 08 PHP
php对文件夹进行相关操作(遍历、计算大小)
Nov 04 PHP
两种php实现图片上传的方法
Jan 22 PHP
PHP memcache在微信公众平台的应用方法示例
Sep 13 PHP
PHP有序表查找之插值查找算法示例
Feb 10 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
后宫无数却洁身自好的男主,唐三只爱小舞
2020/03/02 国漫
腾讯QQ php程序员面试题目整理
2010/06/08 PHP
PHP垃圾回收机制引用计数器概念分析
2013/06/24 PHP
PHP中nowdoc和heredoc使用需要注意的一点
2014/03/21 PHP
PHP中对各种加密算法、Hash算法的速度测试对比代码
2014/07/08 PHP
PHP实现Session入库/存入redis的方法
2017/05/04 PHP
PHP的mysqli_select_db()函数讲解
2019/01/23 PHP
Swoole 5将移除自动添加Event::wait()特性详解
2019/07/10 PHP
通过onmouseover选项卡实现img图片的变化
2014/02/12 Javascript
jQuery实现左右切换焦点图
2015/04/03 Javascript
JavaScript+CSS实现仿天猫侧边网页菜单效果
2015/08/25 Javascript
Bootstrap前端开发案例一
2016/06/17 Javascript
JavaScript 判断一个对象{}是否为空对象的简单方法
2016/10/09 Javascript
ES6概念 Symbol.keyFor()方法
2016/12/25 Javascript
Node.js Express 框架 POST方法详解
2017/01/23 Javascript
在Js页面通过POST传递参数跳转到新页面详解
2017/08/25 Javascript
vue 封装自定义组件之tabal列表编辑单元格组件实例代码
2017/09/07 Javascript
jQuery简单实现对数组去重及排序操作实例
2017/10/31 jQuery
Vue实现浏览器打印功能的代码
2020/04/17 Javascript
简单的通用表达式求10乘阶示例
2014/03/03 Python
python编程培训 python培训靠谱吗
2018/01/17 Python
CSS3 清除浮动的方法示例
2018/06/01 HTML / CSS
阿里巴巴国际站:Alibaba.com
2016/07/21 全球购物
adidas美国官网:adidas US
2016/09/21 全球购物
Big Green Smile法国:领先的英国有机和天然产品在线商店
2021/01/02 全球购物
应届毕业生求职信范文分享
2013/12/26 职场文书
大学英语演讲稿(中英文对照)
2014/01/14 职场文书
最新会计专业求职信范文
2014/01/28 职场文书
《春晓》教学反思
2014/04/20 职场文书
新学期国旗下演讲稿
2014/05/08 职场文书
经管应届生求职信范文
2014/05/18 职场文书
女生抽烟检讨书
2014/10/05 职场文书
大学生受助感言
2015/08/01 职场文书
初中体育课教学反思
2016/02/16 职场文书
2019年个人工作总结范文
2019/03/25 职场文书
教师学期述职自我鉴定
2019/08/16 职场文书