详解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抓取页面与代码解析 推荐
Jul 23 PHP
ThinkPHP 防止表单重复提交的方法
Aug 08 PHP
phpmail类发送邮件函数代码
Feb 20 PHP
php中serialize序列化与json性能测试的示例分析
Apr 27 PHP
php中stdClass的用法分析
Feb 27 PHP
php中smarty实现多模版网站的方法
Jun 11 PHP
[原创]php简单防盗链验证实现方法
Jul 09 PHP
php处理复杂xml数据示例
Jul 11 PHP
php flush无效,IIS7下php实时输出的方法
Aug 25 PHP
PHP 闭包详解及实例代码
Sep 28 PHP
php post json参数的传递和接收处理方法
May 31 PHP
laravel实现Auth认证,登录、注册后的页面回跳方法
Sep 30 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时间戳使用实例代码
2008/06/07 PHP
CI框架给视图添加动态数据
2014/12/01 PHP
thinkPHP连接sqlite3数据库的实现方法(附Thinkphp代码生成器下载)
2016/05/27 PHP
PHP设置images目录不充许http访问的方法
2016/11/01 PHP
php集成开发环境详解
2019/09/24 PHP
PHP中通过getopt解析GNU C风格命令行选项
2019/11/18 PHP
jQuery 使用手册(二)
2009/09/23 Javascript
Confirmer JQuery确认对话框组件
2010/06/09 Javascript
jquery png 透明解决方案(推荐)
2010/08/21 Javascript
弹出层之1:JQuery.Boxy (一) 使用介绍
2011/10/06 Javascript
Firefox/Chrome/Safari的中可直接使用$/$$函数进行调试
2012/02/13 Javascript
通过length属性判断jquery对象是否存在
2013/10/18 Javascript
jquery 遍历数组 each 方法详解
2016/05/25 Javascript
setTimeout学习小结
2017/02/08 Javascript
Material(包括Material Icon)在Angular2中的使用详解
2018/02/11 Javascript
[42:36]DOTA2上海特级锦标赛B组败者赛 VG VS Spirit第二局
2016/02/26 DOTA
[01:12:53]完美世界DOTA2联赛PWL S2 Forest vs SZ 第一场 11.25
2020/11/26 DOTA
Python 爬虫多线程详解及实例代码
2016/10/08 Python
python 用lambda函数替换for循环的方法
2018/06/09 Python
python利用Opencv实现人脸识别功能
2019/04/25 Python
基于python实现高速视频传输程序
2019/05/05 Python
Python3多目标赋值及共享引用注意事项
2019/05/27 Python
python用match()函数爬数据方法详解
2019/07/23 Python
Python Django 页面上展示固定的页码数实现代码
2019/08/21 Python
美国职棒大联盟官方网上商店:MLBShop.com
2017/11/12 全球购物
兰蔻俄罗斯官方网站:Lancome俄罗斯
2019/12/09 全球购物
急诊科护士自我鉴定
2013/10/14 职场文书
专科应届生求职信
2013/11/24 职场文书
《藏戏》教学反思
2014/02/11 职场文书
研修第一天随笔感言
2014/02/15 职场文书
国际商贸专业自荐信
2014/06/09 职场文书
2014企业领导班子四风对照检查材料思想汇报
2014/09/17 职场文书
2014年销售经理工作总结
2014/12/01 职场文书
销售员岗位职责
2015/02/10 职场文书
2016大学生社会实践心得体会范文
2016/01/14 职场文书
JS不要再到处使用绝对等于运算符了
2021/04/30 Javascript