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制作简单的内容采集器的代码
Nov 28 PHP
某大型网络公司应聘时的笔试题目附答案
Mar 27 PHP
深入探讨<br />和 \r\n两者有什么区别??
Jun 05 PHP
PHP实现中文圆形印章特效
Jun 19 PHP
Yii2框架dropDownList下拉菜单用法实例分析
Jul 18 PHP
PHP数据对象PDO操作技巧小结
Sep 27 PHP
php数据库操作model类(使用__call方法)
Nov 16 PHP
safari下载文件自动加了html后缀问题
Nov 09 PHP
php设计模式之策略模式应用案例详解
Jun 17 PHP
实例化php类时传参的方法分析
Jun 05 PHP
laravel7学习之无限级分类的最新实现方法
Sep 30 PHP
如何用RabbitMQ和Swoole实现一个异步任务系统
May 29 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
AM/FM收音机的安装与调试
2021/03/02 无线电
Extended CHM PHP 语法手册之 DIY
2006/10/09 PHP
用PHP实现小型站点广告管理(修正版)
2006/10/09 PHP
php 自写函数代码 获取关键字 去超链接
2010/02/08 PHP
PHP--用万网的接口实现域名查询功能
2012/12/13 PHP
PHP 导出Excel示例分享
2014/08/18 PHP
MyEclipse常用配置图文教程
2014/09/11 PHP
一波PHP中cURL库的常见用法代码示例
2016/05/06 PHP
PHP实现一个轻量级容器的方法
2019/01/28 PHP
PHP实现的AES 128位加密算法示例
2019/09/16 PHP
javascript 触发事件列表 比较不错
2009/09/03 Javascript
jQuery中setTimeout的几种使用方法小结
2013/04/07 Javascript
jquery操作下拉列表、文本框、复选框、单选框集合(收藏)
2014/01/08 Javascript
原生js实现淘宝首页点击按钮缓慢回到顶部效果
2014/04/06 Javascript
JavaScript编程中的Promise使用大全
2015/07/28 Javascript
JS使用单链表统计英语单词出现次数
2016/06/16 Javascript
详解webpack解惑:require的五种用法
2017/06/09 Javascript
JS实现简单短信验证码界面
2017/08/07 Javascript
p5.js入门教程之鼠标交互的示例
2018/03/16 Javascript
浅谈Node框架接入ELK实践总结
2019/02/22 Javascript
详解将微信小程序接口Promise化并使用async函数
2019/08/05 Javascript
VUE注册全局组件和局部组件过程解析
2019/10/10 Javascript
Angular8 简单表单验证的实现示例
2020/06/03 Javascript
Python实现抓取城市的PM2.5浓度和排名
2015/03/19 Python
python控制台中实现进度条功能
2015/11/10 Python
Python随机生成数据后插入到PostgreSQL
2016/07/28 Python
python实现读取并显示图片的两种方法
2017/01/13 Python
Python Django2.0集成Celery4.1教程
2019/11/19 Python
基于keras 模型、结构、权重保存的实现
2020/01/24 Python
金融专业个人求职信
2013/09/22 职场文书
《生命的药方》教学反思
2014/04/08 职场文书
开展批评与自我批评发言材料
2014/05/15 职场文书
2014教师党员自我评议(5篇)
2014/09/20 职场文书
国家领导干部党的群众路线教育实践活动批评与自我批评材料
2014/09/23 职场文书
作文评语集锦
2014/12/25 职场文书
MySQL 数据恢复的多种方法汇总
2021/06/21 MySQL