详解PHP队列的实现


Posted in PHP onMarch 14, 2019

队列是一种特殊的线性表,它只允许在表的前端,可以称之为front,进行删除操作;而在表的后端,可以称之为rear进行插入操作。队列和堆栈一样,是一种操作受限制的线性表,和堆栈不同之处在于:队列是遵循“先进先出”原则,而堆栈遵循的是“先进后出”原则。队列进行插入操作的端称为队尾,进行删除操作的称为队头,只允许在队尾进行插入操作,在队头进行删除操作。
队列的数据元素又称为队列元素,在队尾中插入一个元素称为入队,在队头删除一个元素称为出队。具体实现参考代码:

<?php
/**
* php队列算法
* 
* Create On 2010-6-4
* Author Been
* QQ:281443751
* Email:binbin1129@126.com
**/
class data {
  //数据
  private $data;
  
  public function __construct($data){
    $this->data=$data;
    echo $data.":哥进队了!<br>";
  }
  
  public function getData(){
    return $this->data;
  }
  public function __destruct(){
    echo $this->data.":哥走了!<br>";
  }
}
class queue{
  protected $front;//队头
  protected $rear;//队尾
  protected $queue=array('0'=>'队尾');//存储队列
  protected $maxsize;//最大数
  
  public function __construct($size){
    $this->initQ($size);
  }
  //初始化队列
  private function initQ($size){
    $this->front=0;
    $this->rear=0;
    $this->maxsize=$size;
  }
  //判断队空
  public function QIsEmpty(){
    return $this->front==$this->rear;
  }
  //判断队满
  public function QIsFull(){
    return ($this->front-$this->rear)==$this->maxsize;
  }
  //获取队首数据
  public function getFrontDate(){
    return $this->queue[$this->front]->getData();
  }
  //入队
  public function InQ($data){
    if($this->QIsFull())echo $data.":我一来咋就满了!(队满不能入队,请等待!)<br>";
    else {
      $this->front++;
      for($i=$this->front;$i>$this->rear;$i--){
        //echo $data;
        if($this->queue[$i])unset($this->queue[$i]);
        $this->queue[$i]=$this->queue[$i-1];
      }
      $this->queue[$this->rear+1]=new data($data);
      //print_r($this->queue);
      //echo $this->front;
      echo '入队成功!<br>';
    }
  }
  //出队
  public function OutQ(){
    if($this->QIsEmpty())echo "队空不能出队!<br>";
    else{
      unset($this->queue[$this->front]);
      $this->front--;
      //print_r($this->queue);
      //echo $this->front;
      echo "出队成功!<br>";
    }
  }
}
$q=new queue(3);
$q->InQ("小苗");
$q->InQ('马帅');
$q->InQ('溜冰');
$q->InQ('张世佳');
$q->OutQ();
$q->InQ("周瑞晓");
$q->OutQ();
$q->OutQ();
$q->OutQ();
$q->OutQ();

本案例中有两个类:

第一个是data类,用于实现数据的存放以及队列元素的入队出队情况;

第二个是queue类,用于队列元素的一些入队出队操作。

队列中包含四个属性:

front(队列的头部)

rear(队列的尾部)

maxsize(队列的长度,即队列元素个数)

queue(存放所有已入队队列元素的对象)

场景说明:

1.初始化队列时,生成一个队列,传入一个参数作为maxsize初始化队列把队尾rear设为0,队头front也设为0,此时queue中只有0号元素,并且rear和front都指向它。

2.入队时,先需要判断队列是否已满(front-rear == maxsize),如果已满不可在插入,如果未满则允许插入。插入时,front自增,然后依次让队列所有元素向前移动一位(让出队尾位置以便插入新元素),然后生成新的data对象插入到队尾位置。

3.出队时,判断队列是否为空(front == rear),如果为空时,无法出队。如果不为空时,删除front指向的对象,并且front自减,完成出队。

运行结果如下:

小苗:哥进队了!
入队成功
马帅:哥进队了!
入队成功
溜冰:哥进队了!
入队成功
张世佳:我一来咋就满了!(队满不能入队,请等待!)
小苗:哥走了!
出队成功!
周瑞晓:哥进队了!
入队成功
马帅:哥走了!
出队成功!
溜冰:哥走了!
出队成功!
周瑞晓:哥走了!
出队成功!
队空不能出队!
队空不能出队!

 以上所述是小编给大家介绍的PHP队列的实现详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
PHP通用检测函数集合
Nov 25 PHP
ajax缓存问题解决途径
Dec 06 PHP
php面向对象全攻略 (二) 实例化对象 使用对象成员
Sep 30 PHP
mac下使用brew配置环境的步骤分享
May 23 PHP
PHP之生成GIF动画的实现方法
Jun 07 PHP
php缓冲输出实例分析
Jan 05 PHP
php 参数过滤、数据过滤详解
Oct 26 PHP
PHP云打印类完整示例
Oct 15 PHP
php 根据自增id创建唯一编号类
Apr 06 PHP
PHP读取CSV大文件导入数据库的实例
Jul 24 PHP
PHP实现带进度条的Ajax文件上传功能示例
Jul 02 PHP
Laravel重定向,a链接跳转,控制器跳转示例
Oct 22 PHP
PHP精确到毫秒秒杀倒计时实例详解
Mar 14 #PHP
PHP的简单跳转提示的实现详解
Mar 14 #PHP
PHP封装的数据库模型Model类完整示例【基于PDO】
Mar 14 #PHP
PHP模型Model类封装数据库操作示例
Mar 14 #PHP
php中pcntl_fork创建子进程的方法实例
Mar 14 #PHP
PHP7内核之Reference详解
Mar 14 #PHP
掌握PHP垃圾回收机制详解
Mar 13 #PHP
You might like
在Windows系统上安装PHP运行环境文字教程
2010/07/19 PHP
php导入导出excel实例
2013/10/25 PHP
PHP常用技术文之文件操作和目录操作总结
2014/09/27 PHP
PHP面向对象程序设计之对象的遍历操作示例
2019/06/12 PHP
微信公众号之主动给用户发送消息功能
2019/06/22 PHP
javascript读写XML实现广告轮换(兼容IE、FF)
2013/08/09 Javascript
查看大图功能代码jquery版
2013/11/05 Javascript
使用js判断数组中是否包含某一元素(类似于php中的in_array())
2013/12/12 Javascript
三种方式获取XMLHttpRequest对象
2014/04/21 Javascript
BAT及各大互联网公司2014前端笔试面试题--JavaScript篇
2014/10/29 Javascript
创建js对象和js类的方法汇总
2014/12/24 Javascript
AngularJS入门教程之更多模板详解
2016/08/19 Javascript
纯原生js实现table表格的增删
2017/01/05 Javascript
jQuery Form表单取值的方法
2017/01/11 Javascript
JS实现的DIV块来回滚动效果示例
2017/02/07 Javascript
Node.js常用工具之util模块
2017/03/09 Javascript
Bootstrap笔记之缩略图、警告框实例详解
2017/03/09 Javascript
Vue 中如何将函数作为 props 传递给组件的实现代码
2020/05/12 Javascript
Handtrack.js库实现实时监测手部运动(推荐)
2021/02/08 Javascript
Python的Django框架中的URL配置与松耦合
2015/07/15 Python
Python中的模块导入和读取键盘输入的方法
2015/10/16 Python
Python使用django搭建web开发环境
2017/06/09 Python
基于循环神经网络(RNN)的古诗生成器
2018/03/26 Python
Python列表切片操作实例总结
2019/02/19 Python
Django为窗体加上防机器人的验证码功能过程解析
2019/08/14 Python
Python读取VOC中的xml目标框实例
2020/03/10 Python
Python基于进程池实现多进程过程解析
2020/04/30 Python
如何用 Python 制作 GitHub 消息助手
2021/02/20 Python
数据库什么时候应该被重组
2012/11/02 面试题
班组长安全生产职责
2013/12/16 职场文书
临床医师专业个人自我评价
2014/01/08 职场文书
元旦晚会主持词
2014/03/24 职场文书
大学生操行评语大全
2014/12/31 职场文书
青年教师个人总结
2015/02/11 职场文书
关于办理居住证的介绍信模板
2019/11/27 职场文书
Python爬虫入门案例之回车桌面壁纸网美女图片采集
2021/10/16 Python