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实现让页面只能被百度gogole蜘蛛访问的方法
Dec 29 PHP
php生成N个不重复的随机数实例
Nov 12 PHP
codeigniter框架批量插入数据
Jan 09 PHP
php获得url参数中具有&amp;的值的方法
Mar 05 PHP
详谈PHP文件目录基础操作
Nov 11 PHP
PHP代码优化技巧小结
Sep 29 PHP
PHP微信开发之微信消息自动回复下所遇到的坑
May 09 PHP
php表单加入Token防止重复提交的方法分析
Oct 10 PHP
thinkPHP5 ACL用户权限模块用法详解
May 10 PHP
在 Laravel 中 “规范” 的开发短信验证码发送功能
Oct 26 PHP
php和nginx交互实例讲解
Sep 24 PHP
PHP使用PDO 连接与连接管理操作实例分析
Apr 21 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
smarty模板嵌套之include与fetch性能测试
2010/12/05 PHP
PHP获取windows登录用户名的方法
2014/06/24 PHP
windows7下安装php的imagick和imagemagick扩展教程
2014/07/04 PHP
安装docker和docker-compose实例详解
2019/07/30 PHP
php正则表达式使用方法整理集合
2020/01/31 PHP
JS支持带x身份证号码验证函数
2008/08/10 Javascript
Javascript下IE与Firefox下的差异兼容写法总结
2010/06/18 Javascript
jquery 获取dom固定元素 添加样式的简单实例
2014/02/04 Javascript
jQuery Ajax()方法使用指南
2014/11/19 Javascript
javascript跨域原因以及解决方案分享
2015/04/08 Javascript
深入学习nodejs中的async模块的使用方法
2017/07/12 NodeJs
BackBone及其实例探究_动力节点Java学院整理
2017/07/14 Javascript
requireJS模块化实现返回顶部功能的方法详解
2017/10/16 Javascript
解决bootstrap模态框数据缓存的问题方法
2018/08/10 Javascript
vue-cli项目使用mock数据的方法(借助express)
2019/04/15 Javascript
Vue实现购物车的全选、单选、显示商品价格代码实例
2019/05/06 Javascript
微信小程序的线程架构【推荐】
2019/05/14 Javascript
我所理解的JavaScript中的this指向
2020/09/04 Javascript
python re正则表达式模块(Regular Expression)
2014/07/16 Python
django中的HTML控件及参数传递方法
2018/03/20 Python
python实现数据导出到excel的示例--普通格式
2018/05/03 Python
详解pandas库pd.read_excel操作读取excel文件参数整理与实例
2019/02/17 Python
PyTorch基本数据类型(一)
2019/05/22 Python
python 进程的几种创建方式详解
2019/08/29 Python
英国豪华家具和家居用品购物网站:Teddy Beau
2020/10/12 全球购物
GOLFINO英国官网:高尔夫服装
2020/04/11 全球购物
架构师岗位职责
2013/11/18 职场文书
单位消防安全制度
2014/01/12 职场文书
副乡长群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
2014年平安建设工作总结
2014/11/19 职场文书
人事行政助理岗位职责
2015/04/11 职场文书
聘任书格式及范文
2015/09/21 职场文书
2016元旦文艺汇演主持词(开场白+结束语)
2015/12/03 职场文书
Node实现搜索框进行模糊查询
2021/06/28 Javascript
Pygame Rect区域位置的使用(图文)
2021/11/17 Python
MySQL表锁、行锁、排它锁及共享锁的使用详解
2022/04/02 MySQL