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来处理多个提交任务
May 08 PHP
PHP生成Flash动画的实现代码
Mar 12 PHP
PHP中计算字符串相似度的函数代码
Dec 29 PHP
PHP读取汉字的点阵数据
Jun 22 PHP
php随机显示指定文件夹下图片的方法
Jul 13 PHP
php打包网站并在线压缩为zip
Feb 13 PHP
实例讲解PHP设计模式编程中的简单工厂模式
Feb 29 PHP
Yii2 rbac权限控制之菜单menu实例教程
Apr 28 PHP
一波PHP中cURL库的常见用法代码示例
May 06 PHP
适合PHP初学者阅读的4本经典书籍
Sep 23 PHP
PHP实现的CURL非阻塞调用类
Jul 26 PHP
laravel添加前台跳转成功页面示例
Oct 22 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/11/03 PHP
PHP基于mssql扩展远程连接MSSQL的简单实现方法
2016/10/08 PHP
Javascript实现网络监测的方法
2015/07/31 Javascript
js获取iframe中的window对象的实现方法
2016/05/20 Javascript
返回函数的JavaScript函数
2016/06/14 Javascript
JS监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法
2016/08/05 Javascript
学习Javascript闭包(Closure)知识
2016/08/07 Javascript
webpack+vue.js实现组件化详解
2016/10/12 Javascript
第一次接触Bootstrap框架
2016/10/24 Javascript
node.js+jQuery实现用户登录注册AJAX交互
2017/04/28 jQuery
为你的微信小程序体积瘦身详解
2017/05/20 Javascript
详解bootstrap用dropdown-menu实现上下文菜单
2017/09/22 Javascript
基于Vue的SPA动态修改页面title的方法(推荐)
2018/01/02 Javascript
Vue 中如何正确引入第三方模块的方法步骤
2019/05/05 Javascript
jquery ui 实现 tab标签功能示例【测试可用】
2019/07/25 jQuery
Json实现传值到后台代码实例
2020/06/30 Javascript
解决element-ui的下拉框有值却无法选中的情况
2020/11/07 Javascript
[02:06]2018完美世界全国高校联赛秋季赛开始报名(附彩蛋)
2018/09/03 DOTA
python对html代码进行escape编码的方法
2015/05/04 Python
python实现简易云音乐播放器
2018/01/04 Python
python opencv之SURF算法示例
2018/02/24 Python
python SQLAlchemy的Mapping与Declarative详解
2019/07/04 Python
Django之使用celery和NGINX生成静态页面实现性能优化
2019/10/08 Python
pytorch 实现打印模型的参数值
2019/12/30 Python
TensorFlow加载模型时出错的解决方式
2020/02/06 Python
python 读取二进制 显示图片案例
2020/04/24 Python
英国当代时尚和街头服饰店:18montrose
2018/12/15 全球购物
King Apparel官网:英国街头服饰品牌
2019/09/05 全球购物
写一个在SQL Server创建表的SQL语句
2012/03/10 面试题
施工安全承诺书
2014/05/22 职场文书
企业安全生产月活动总结
2014/07/05 职场文书
家庭贫困证明书(3篇)
2014/09/15 职场文书
先进个人推荐材料
2014/12/29 职场文书
幼儿园大班毕业评语
2014/12/31 职场文书
话题作文之关于呼唤
2019/11/29 职场文书
使用canvas对video视频某一刻截图功能
2021/09/25 HTML / CSS