详解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日历程序
Dec 06 PHP
浅析php与数据库代码开发规范
Aug 08 PHP
php实现的SESSION类
Dec 02 PHP
php实现用手机关闭计算机(电脑)的方法
Apr 22 PHP
PHP自带方法验证邮箱是否存在
Feb 01 PHP
PHP中如何判断exec函数执行成功?
Aug 04 PHP
解决form中action属性后面?传递参数 获取不到的问题
Jul 21 PHP
PHP对象的浅复制与深复制的实例详解
Oct 26 PHP
PHP使用zlib扩展实现GZIP压缩输出的方法详解
Apr 09 PHP
php实现QQ小程序发送模板消息功能
Sep 18 PHP
Yii使用DbTarget实现日志功能的示例代码
Jul 21 PHP
PHP文件打开关闭及读写操作示例解析
Aug 06 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将字符串转化成date存入数据库的两种方式
2014/04/28 PHP
php实现有趣的人品测试程序实例
2015/06/08 PHP
PHP中empty和isset对于参数结构的判断及empty()和isset()的区别
2015/11/15 PHP
Zend Framework教程之Zend_Config_Xml用法分析
2016/03/23 PHP
Apache无法自动跳转却显示目录的解决方法
2020/11/30 PHP
在php的yii2框架中整合hbase库的方法
2018/09/20 PHP
Ajax+PHP实现的模拟进度条功能示例
2019/02/11 PHP
js计数器代码
2006/11/04 Javascript
文本框的字数限制功能jquery插件
2009/11/24 Javascript
基于jquery库的tab新形式使用
2012/11/16 Javascript
js验证输入是否为手机号码或电话号码示例
2013/12/30 Javascript
与Math.pow 相反的函数使用介绍
2014/08/04 Javascript
通过jquery 获取URL参数并进行转码
2014/08/18 Javascript
在页面中输出当前客户端时间javascript实例代码
2016/03/02 Javascript
使用CSS+JavaScript或纯js实现半透明遮罩效果的实例分享
2016/05/09 Javascript
AngularJS基础 ng-value 指令简单示例
2016/08/03 Javascript
JS实现批量上传文件并显示进度功能
2017/06/27 Javascript
基于jquery trigger函数无法触发a标签的两种解决方法
2018/01/06 jQuery
centos 上快速搭建ghost博客方法分享
2018/05/23 Javascript
详解Vue实战指南之依赖注入(provide/inject)
2018/11/13 Javascript
微信小程序实现的图片保存功能示例
2019/04/24 Javascript
通过实例解析vuejs如何实现调试代码
2020/07/16 Javascript
python多重继承实例
2014/10/11 Python
对Python进行数据分析_关于Package的安装问题
2017/05/22 Python
详解Python3 对象组合zip()和回退方式*zip
2019/05/15 Python
python binascii 进制转换实例
2019/06/12 Python
python pyqtgraph 保存图片到本地的实例
2020/03/14 Python
英国床垫和床架购物网站:Bedman
2019/11/04 全球购物
俄罗斯奢侈品牌衣服、鞋子和配饰的在线商店:INTERMODA
2020/07/17 全球购物
Ruby如何进行文件操作
2014/07/17 面试题
行政部岗位职责范本
2014/03/13 职场文书
小学先进集体事迹材料
2014/05/31 职场文书
2015年世界环境日活动方案
2015/05/05 职场文书
2016年班主任培训心得体会
2016/01/07 职场文书
php 防护xss,PHP的防御XSS注入的终极解决方案
2021/04/01 PHP
gtx1650怎么样 gtx1650显卡相当于什么级别
2022/04/08 数码科技