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
也谈截取首页新闻 - 范例
Oct 09 PHP
逐步提升php框架的性能
Jan 10 PHP
php中一个有意思的日期逻辑处理
Mar 25 PHP
Apache服务器无法使用的解决方法
May 08 PHP
spl_autoload_register与autoload的区别详解
Jun 03 PHP
PHP和JavaScrip分别获取关联数组的键值示例代码
Sep 16 PHP
php采用curl模仿登录人人网发布动态的方法
Nov 07 PHP
PHP超全局数组(Superglobals)介绍
Jul 01 PHP
PHP 记录访客的浏览信息方法
Jan 29 PHP
PDO::quote讲解
Jan 29 PHP
php并发加锁问题分析与设计代码实例讲解
Feb 26 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中unlink()、mkdir()、rmdir()等方法的使用介绍
2012/12/21 PHP
解决表单中第一个非隐藏的元素获得焦点的一个方案
2009/10/26 Javascript
Jquery乱码的一次解决过程 图解教程
2010/02/20 Javascript
火狐4、谷歌12不支持Jquery Validator的解决方法分享
2011/06/20 Javascript
Jquery 数组操作大全个人总结
2013/11/13 Javascript
JS更改select内option属性的方法
2015/10/14 Javascript
讲解JavaScript的Backbone.js框架的MVC结构设计理念
2016/02/14 Javascript
AngularJS ng-change 指令的详解及简单实例
2016/07/30 Javascript
利用原生js和jQuery实现单选框的勾选和取消操作的方法
2016/09/04 Javascript
基于vuejs+webpack的日期选择插件
2020/05/21 Javascript
基于bootstrap风格的弹框插件
2016/12/28 Javascript
微信小程序 开发之快递查询功能的实现
2017/01/09 Javascript
vue.js实现含搜索的多种复选框(附源码)
2017/03/23 Javascript
VueJS如何引入css或者less文件的一些坑
2017/04/25 Javascript
JS实现动态无缝轮播
2020/01/11 Javascript
JS数组进阶示例【数组的几种函数用法】
2020/01/16 Javascript
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
2015/03/06 Python
详细分析python3的reduce函数
2017/12/05 Python
深入了解Python中pop和remove的使用方法
2018/01/09 Python
使用python实现BLAST
2018/02/12 Python
Python3中的json模块使用详解
2018/05/05 Python
python实现最长公共子序列
2018/05/22 Python
Python简单实现网页内容抓取功能示例
2018/06/07 Python
详解Python网络框架Django和Scrapy安装指南
2019/04/01 Python
基于python实现简单网页服务器代码实例
2020/09/14 Python
HTML5 video视频字幕的使用和制作方法
2018/05/03 HTML / CSS
欧洲最大的化妆品连锁公司:Douglas道格拉斯
2017/05/06 全球购物
Lands’ End英国官方网站:高质量男女服装
2017/10/07 全球购物
毕业生护理专业个人求职信范文
2014/01/04 职场文书
高一英语教学反思
2014/01/22 职场文书
公务员试用期满考核材料
2014/05/22 职场文书
幼师求职信
2014/06/23 职场文书
行政求职信
2014/07/04 职场文书
2015年超市工作总结
2015/04/09 职场文书
2015年终个人政治思想工作总结
2015/11/24 职场文书
使用Docker容器部署rocketmq单机的全过程
2022/04/03 Servers