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 xml文件操作实现代码(二)
Mar 20 PHP
PHP 翻页 实例代码
Aug 07 PHP
Linux fgetcsv取得的数组元素为空字符串的解决方法
Nov 25 PHP
PHP在线生成二维码代码(google api)
Jun 03 PHP
解析thinkphp的左右值无限分类
Jun 20 PHP
PHP goto语句简介和使用实例
Mar 11 PHP
PHP间隔一段时间执行代码的方法
Dec 02 PHP
php正则匹配html中带class的div并选取其中内容的方法
Jan 13 PHP
php socket通信(tcp/udp)实例分析
Feb 14 PHP
浅谈PHP面向对象之访问者模式+组合模式
May 22 PHP
PHP7实现和CryptoJS的AES加密方式互通示例【AES-128-ECB加密】
Jun 08 PHP
PHP使用Session实现上传进度功能详解
Aug 06 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文章采集URL补全函数(FormatUrl)
2012/08/02 PHP
非常好用的Zend Framework分页类
2014/06/25 PHP
php程序内部post数据的方法
2015/03/31 PHP
深入解析PHP中foreach语句控制数组循环的用法
2015/11/30 PHP
thinkPHP框架实现的短信接口验证码功能示例
2018/06/20 PHP
优化网页之快速的呈现我们的网页
2007/06/29 Javascript
dtree 网页树状菜单及传递对象集合到js内,动态生成节点
2012/04/14 Javascript
动态添加删除表格行的js实现代码
2014/02/28 Javascript
原生js实现日期联动
2015/01/12 Javascript
JavaScript事件委托用法分析
2015/01/24 Javascript
jquery中radio checked问题
2015/03/16 Javascript
javascript发送短信验证码实现代码
2015/11/12 Javascript
全面了解javascript三元运算符
2016/06/27 Javascript
javascript判断回文数详解及实现代码
2017/02/03 Javascript
jQuery给表格添加分页效果
2017/03/02 Javascript
jquery实现超简单的瀑布流布局【推荐】
2017/03/08 Javascript
angularjs项目的页面跳转如何实现(5种方法)
2017/05/25 Javascript
详解Vue 方法与事件处理器
2017/06/20 Javascript
通过命令行创建vue项目的方法
2017/07/20 Javascript
React组件中的this的具体使用
2018/02/28 Javascript
JS实现图片轮播效果实例详解【可自动和手动】
2019/04/04 Javascript
JavaScript实现的滚动公告特效【基于jQuery】
2019/07/10 jQuery
[54:09]RNG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
通过代码实例展示Python中列表生成式的用法
2015/03/31 Python
Python抓取框架 Scrapy的架构
2016/08/12 Python
Python实现读写sqlite3数据库并将统计数据写入Excel的方法示例
2017/08/07 Python
解决python3中自定义wsgi函数,make_server函数报错的问题
2017/11/21 Python
Python使用plt.boxplot() 参数绘制箱线图
2020/06/04 Python
浅析Python requests 模块
2020/10/09 Python
canvas压缩图片以及卡片制作的方法示例
2018/12/04 HTML / CSS
健身场所或家用健身设备:Life Fitness
2017/11/01 全球购物
美体小铺奥地利官方网站:The Body Shop奥地利
2019/04/11 全球购物
日常奢侈品,轻松购物:Verishop
2019/08/20 全球购物
爱护草坪标语
2014/06/24 职场文书
工会文体活动总结
2015/05/07 职场文书
你真的了解redis为什么要提供pipeline功能
2021/06/22 Redis