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 相关文章推荐
如何实现给定日期的若干天以后的日期
Oct 09 PHP
随时给自己贴的图片加文字的php水印
Mar 16 PHP
php discuz 主题表和回帖表的设计
Mar 13 PHP
php file_get_contents函数轻松采集html数据
Apr 22 PHP
thinkphp控制器调度使用示例
Feb 24 PHP
PHP开发框架Laravel数据库操作方法总结
Sep 03 PHP
PHP生成网站桌面快捷方式代码分享
Oct 11 PHP
php递归遍历多维数组的方法
Apr 18 PHP
PHP模板引擎Smarty之配置文件在模板变量中的使用方法示例
Apr 11 PHP
CI框架的安全性分析
May 18 PHP
PHP-FPM的配置与优化讲解
Mar 15 PHP
tp5 sum某个字段相加得到总数的例子
Oct 18 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中利用explode函数分割字符串到数组
2014/02/08 PHP
PHP基于curl模拟post提交json数据示例
2018/06/22 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
css图片自适应大小
2007/11/28 Javascript
JQuery为textarea添加maxlength属性并且兼容IE
2013/04/25 Javascript
怎么清空javascript数组
2013/05/11 Javascript
jQuery获取和设置表单元素的方法
2014/02/14 Javascript
原生Javascript封装的一个AJAX函数分享
2014/10/11 Javascript
JavaScript中通过prototype属性共享属性和方法的技巧实例
2015/03/13 Javascript
JavaScript判断用户是否对表单进行了修改的方法
2015/03/18 Javascript
jquery常用函数与方法汇总
2015/09/01 Javascript
解决VUEX兼容IE上的报错问题
2018/03/01 Javascript
解决vue build打包之后首页白屏的问题
2018/03/06 Javascript
vue-devtools的安装步骤
2018/04/23 Javascript
JS Array.from()将伪数组转换成数组的方法示例
2020/03/23 Javascript
python发腾讯微博代码分享
2014/01/10 Python
从零学Python之入门(三)序列
2014/05/25 Python
利用Python破解验证码实例详解
2016/12/08 Python
对python:threading.Thread类的使用方法详解
2019/01/31 Python
Python list列表中删除多个重复元素操作示例
2019/02/27 Python
Python如何给函数库增加日志功能
2020/08/04 Python
python爬虫快速响应服务器的做法
2020/11/24 Python
Pycharm 如何一键加引号的方法步骤
2021/02/05 Python
Python将QQ聊天记录生成词云的示例代码
2021/02/10 Python
HTML5 Blob 实现文件下载功能的示例代码
2019/11/29 HTML / CSS
如何删除一个表里面的重复行
2013/07/13 面试题
会计系个人求职信范文分享
2013/12/20 职场文书
物流专业大学的自我评价
2014/01/11 职场文书
初二物理教学反思
2014/01/29 职场文书
就业意向书范文
2014/04/01 职场文书
演讲稿格式范文
2014/05/19 职场文书
世博会口号
2014/06/20 职场文书
舌尖上的中国观后感
2015/06/02 职场文书
2015年小学生国庆节演讲稿
2015/07/30 职场文书
学校财务管理制度
2015/08/04 职场文书
Golang原生rpc(rpc服务端源码解读)
2022/04/07 Golang