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
使用网络地址转换实现多服务器负载均衡
Oct 09 PHP
第四节--构造函数和析构函数
Nov 16 PHP
php UTF-8、Unicode和BOM问题
May 18 PHP
php简单开启gzip压缩方法(zlib.output_compression)
Apr 13 PHP
一致性哈希算法以及其PHP实现详细解析
Aug 24 PHP
php实现webservice实例
Nov 06 PHP
php实现计数器方法小结
Jan 05 PHP
详解PHP中的mb_detect_encoding函数使用方法
Aug 18 PHP
CodeIgniter配置之SESSION用法实例分析
Jan 19 PHP
php实现的支付宝网页支付功能示例【基于TP5框架】
Sep 16 PHP
Laravel 添加多语言提示信息的方法
Sep 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
php 三维饼图的实现代码
2008/09/28 PHP
PHP 上传文件大小限制
2009/07/05 PHP
异步加载技术实现当滚动条到最底部的瀑布流效果
2014/09/16 PHP
学习php设计模式 php实现装饰器模式(decorator)
2015/12/07 PHP
PHP仿微信多图片预览上传实例代码
2016/09/13 PHP
php mysql获取表字段名称和字段信息的三种方法
2016/11/13 PHP
php支付宝系列之电脑网站支付
2018/05/30 PHP
js 新浪的一个图片播放图片轮换效果代码
2008/07/15 Javascript
基于jquery扩展漂亮的下拉框可以二次修改
2013/11/19 Javascript
Jjcarousellite 实现图片列表滚动的简单实例
2013/11/29 Javascript
sogou地图API用法实例教程
2014/09/11 Javascript
Bootstrap基础学习
2015/06/16 Javascript
JavaScript简单实现鼠标移动切换图片的方法
2016/02/23 Javascript
第八篇Bootstrap下拉菜单实例代码
2016/06/21 Javascript
Vue.js常用指令汇总(v-if、v-for等)
2016/11/03 Javascript
JavaScript利用闭包实现模块化
2017/01/13 Javascript
jQuery实现页面倒计时并刷新效果
2017/03/13 Javascript
关于vue.js v-bind 的一些理解和思考
2017/06/06 Javascript
vue实现模态框的通用写法推荐
2018/02/26 Javascript
微信小程序的部署方法步骤
2018/09/04 Javascript
vue-cli3+typescript初体验小结
2019/02/28 Javascript
JS实现查找数组中对象的属性值是否存在示例
2019/05/24 Javascript
JS实现提示效果弹出及延迟隐藏的功能
2019/08/26 Javascript
nodejs文件夹深层复制功能
2019/09/03 NodeJs
使用layer弹窗,制作编辑User信息页面的方法
2019/09/27 Javascript
手把手带你入门微信小程序新框架Kbone的使用
2020/02/25 Javascript
[03:27]最受玩家喜爱奖提名:PZH_Element 致玩家寄语
2016/12/20 DOTA
Python 命令行参数sys.argv
2008/09/06 Python
python转换摩斯密码示例
2014/02/16 Python
python获取当前运行函数名称的方法实例代码
2017/04/06 Python
协议书范本
2014/04/23 职场文书
服务之星事迹材料
2014/05/03 职场文书
2014报到证办理个人委托书
2014/10/08 职场文书
简易离婚协议书范本2014
2014/10/15 职场文书
win10安装配置nginx的过程
2021/03/31 Servers
Python+腾讯云服务器实现每日自动健康打卡
2021/12/06 Python