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 相关文章推荐
joomla内置的表单验证功能使用方法
Jun 11 PHP
php适配器模式介绍
Aug 14 PHP
PHP autoload与spl_autoload自动加载机制的深入理解
Jun 05 PHP
PHP父类调用子类方法的代码例子
Apr 09 PHP
php读取大文件示例分享(文件操作类)
Apr 13 PHP
PHP获取客户端真实IP地址的5种情况分析和实现代码
Jul 08 PHP
PHP实现的简单日历类
Nov 29 PHP
PHP的Socket网络编程入门指引
Aug 11 PHP
php curl中gzip的压缩性能测试实例分析
Nov 08 PHP
php+javascript实现的动态显示服务器运行程序进度条功能示例
Aug 07 PHP
php 获取xml接口数据的处理方法
May 31 PHP
phpstudy隐藏index.php的方法
Sep 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
snoopy PHP版的网络客户端提供本地下载
2008/04/15 PHP
一个PHP分页类的代码
2011/05/18 PHP
ThinkPHP 防止表单重复提交的方法
2011/08/08 PHP
phpmyadmin3 安装配置图解教程
2012/03/29 PHP
PHP 基于Yii框架中使用smarty模板的方法详解
2013/06/13 PHP
Yii框架 session 数据库存储操作方法示例
2019/11/18 PHP
PHP sdk文档处理常用代码示例解析
2020/12/09 PHP
js左侧多级菜单动态的解决方案
2010/02/01 Javascript
js setTimeout 参数传递使用介绍
2013/08/13 Javascript
一个JS函数搞定网页标题(title)闪动效果
2014/05/13 Javascript
javascript实现的猜数小游戏完整实例代码
2016/05/10 Javascript
深入理解React中es6创建组件this的方法
2016/08/29 Javascript
JS简单获取客户端IP地址的方法【调用搜狐接口】
2016/09/05 Javascript
AnjularJS中$scope和$rootScope的区别小结
2016/09/18 Javascript
Bootstrap 网站实例之单页营销网站
2016/10/20 Javascript
JavaScript实现的select点菜功能示例
2017/01/16 Javascript
vue.js实现单选框、复选框和下拉框示例
2017/07/18 Javascript
AngularJs点击状态值改变背景色的实例
2017/12/18 Javascript
Vue.js实现可配置的登录表单代码详解
2018/03/29 Javascript
详解jQuery-each()方法
2019/03/13 jQuery
layui输入框只允许输入中文且判断长度的例子
2019/09/18 Javascript
基于vue和websocket的多人在线聊天室
2020/02/01 Javascript
Python中动态获取对象的属性和方法的教程
2015/04/09 Python
Django 浅谈根据配置生成SQL语句的问题
2018/05/29 Python
Python 字符串换行的多种方式
2018/09/06 Python
python中字符串数组逆序排列方法总结
2019/06/23 Python
python的re模块使用方法详解
2019/07/26 Python
Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
2019/09/17 Python
CSS3中的opacity属性使用教程
2015/08/19 HTML / CSS
SmartBuyGlasses台湾:名牌眼镜,名牌太阳眼镜及隐形眼镜
2017/01/04 全球购物
Otel.com:折扣酒店预订
2017/08/24 全球购物
意大利文具和办公产品在线商店:Y-Office
2020/02/27 全球购物
2014年远程教育工作总结
2014/12/09 职场文书
初中作文评语
2014/12/25 职场文书
如何开发一个渐进式Web应用程序PWA
2021/05/10 Javascript
Java输出Hello World完美过程解析
2021/06/13 Java/Android