详解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用SAX解析XML的实现代码与问题分析
Aug 22 PHP
基于PHP遍历数组的方法汇总分析
Jun 08 PHP
linux中cd命令使用详解
Jan 08 PHP
php如何连接sql server
Oct 16 PHP
非常经典的PHP文件上传类分享
May 15 PHP
基于PHP生成简单的验证码
Jun 01 PHP
thinkPHP模板中for循环与switch语句用法示例
Nov 30 PHP
php判断是否连接上网络的方法实例详解
Dec 14 PHP
PHP7扩展开发之基于函数方式使用lib库的方法详解
Jan 15 PHP
PHP PDOStatement::setFetchMode讲解
Feb 03 PHP
laravel ORM关联关系中的 with和whereHas用法
Oct 16 PHP
Yii 框架入口脚本示例分析
May 19 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
PHP中copy on write写时复制机制介绍
2014/05/13 PHP
在CentOS上搭建LAMP+vsftpd环境的简单指南
2015/08/01 PHP
PHP内存缓存功能memcached示例
2016/10/19 PHP
PHP实现二维数组按某列进行排序的方法
2016/11/18 PHP
php中照片旋转 (orientation) 问题的正确处理
2017/02/16 PHP
thinkPHP3.2.2框架行为扩展及demo示例
2018/06/19 PHP
在JavaScript中获取请求的URL参数
2010/12/22 Javascript
JavaScript中Math对象方法使用概述
2014/01/02 Javascript
Markdown与Bootstrap相结合实现图片自适应属性
2016/05/04 Javascript
JS锚点的设置与使用方法
2016/09/05 Javascript
React-Native 组件之 Modal的使用详解
2017/08/08 Javascript
微信小程序实现tab左右切换效果
2020/11/15 Javascript
在vue中实现点击选择框阻止弹出层消失的方法
2018/09/15 Javascript
IE8中jQuery.load()加载页面不显示的原因
2018/11/15 jQuery
微信小程序提交form操作示例
2018/12/30 Javascript
vue接入腾讯防水墙代码
2019/05/07 Javascript
微信小程序 腾讯地图SDK 获取当前地址实现解析
2019/08/12 Javascript
vue中 数字相加为字串转化为数值的例子
2019/11/07 Javascript
在vue中嵌入外部网站的实现
2020/11/13 Javascript
[48:21]林俊杰圣堂刺客超神杀戮秀
2014/10/29 DOTA
Python2.x版本中maketrans()方法的使用介绍
2015/05/19 Python
python面向对象实现名片管理系统文件版
2019/04/26 Python
Scrapy-Redis结合POST请求获取数据的方法示例
2019/05/07 Python
python函数与方法的区别总结
2019/06/23 Python
TensorFlow命名空间和TensorBoard图节点实例
2020/01/23 Python
Python延迟绑定问题原理及解决方案
2020/08/04 Python
基于python的opencv图像处理实现对斑马线的检测示例
2020/11/29 Python
python之随机数函数的实现示例
2020/12/30 Python
python模块内置属性概念及实例
2021/02/18 Python
canvas绘制树形结构可视图形的实现
2020/04/03 HTML / CSS
大学生万能检讨书范例
2014/10/04 职场文书
债务授权委托书范本
2014/10/17 职场文书
2015年暑期见闻
2015/07/14 职场文书
2016年万圣节活动个人总结
2016/04/05 职场文书
Python中Selenium对Cookie的操作方法
2021/07/09 Python
用Python仅20行代码编写一个简单的端口扫描器
2022/04/08 Python