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 25 PHP
ajax在joomla中的原生态应用代码
Jul 19 PHP
apache和php之间协同工作的配置经验分享
Apr 08 PHP
Apache实现Web Server负载均衡详解(不考虑Session版)
Jul 05 PHP
php实现12306余票查询、价格查询示例
Apr 17 PHP
如何批量清理系统临时文件(语言:C#、 C/C++、 php 、python 、java )
Feb 01 PHP
php实现留言板功能(代码详解)
Mar 28 PHP
PHP高精确度运算BC函数库实例详解
Aug 15 PHP
Thinkphp开发--集成极光推送
Sep 15 PHP
php提取微信账单的有效信息
Oct 01 PHP
ThinkPHP3.2.3框架邮件发送功能图文实例详解
Apr 23 PHP
php实现商城购物车的思路和源码分析
Jul 23 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遍历二维数组的代码
2011/04/22 PHP
php和js如何通过json互相传递数据相关问题探讨
2013/02/26 PHP
php使用curl实现ftp文件下载功能
2017/05/16 PHP
WHOOPS PHP调试库的使用
2017/09/29 PHP
PHP配置ZendOpcache插件加速
2019/02/14 PHP
JS 有名函数表达式全面解析
2010/03/19 Javascript
js控制不同的时间段显示不同的css样式的实例代码
2013/11/04 Javascript
JavaScript闭包函数访问外部变量的方法
2014/08/27 Javascript
javascript结合CSS实现苹果开关按钮特效
2015/04/07 Javascript
JavaScript对数组进行随机重排的方法
2015/07/22 Javascript
javascript日期格式化方法小结
2015/12/17 Javascript
解析javascript瀑布流原理实现图片滚动加载
2016/03/10 Javascript
javascript的几种写法总结
2016/09/30 Javascript
Javascript 实现放大镜效果实例详解
2016/12/03 Javascript
Nodejs之http的表单提交
2017/07/07 NodeJs
微信小程序 自定义消息提示框
2017/08/06 Javascript
vue2.0开发入门笔记之.vue文件的生成和使用
2017/09/19 Javascript
vue webpack实用技巧总结
2018/04/24 Javascript
bootstrap 日期控件 datepicker被弹出框dialog覆盖的解决办法
2019/07/09 Javascript
浅谈Vue 自动化部署打包上线
2020/06/14 Javascript
vue实现数字滚动效果
2020/06/29 Javascript
Python中使用Beautiful Soup库的超详细教程
2015/04/30 Python
举例讲解如何在Python编程中进行迭代和遍历
2016/01/19 Python
Python使用正则表达式获取网页中所需要的信息
2018/01/29 Python
PyCharm-错误-找不到指定文件python.exe的解决方法
2019/07/01 Python
TensorFlow车牌识别完整版代码(含车牌数据集)
2019/08/05 Python
python实现从尾到头打印单链表操作示例
2020/02/22 Python
Python flask框架实现浏览器点击自定义跳转页面
2020/06/04 Python
自我评价范文点评
2013/12/04 职场文书
大学军训感想
2014/02/12 职场文书
买房协议书范本
2014/10/23 职场文书
2015年党员创先争优承诺书
2015/01/22 职场文书
电影地道战观后感
2015/06/04 职场文书
Python中threading库实现线程锁与释放锁
2021/05/17 Python
MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法
2022/04/18 MySQL
MySQL常用慢查询分析工具详解
2022/08/14 MySQL