详解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中获取文件扩展名的N种方法小结
Feb 27 PHP
Window 7/XP 安装Apache 2.4与PHP 5.4 的过程详解
Jun 02 PHP
解析mysql 表中的碎片产生原因以及清理
Jun 22 PHP
分割GBK中文遭遇乱码的解决方法
Aug 09 PHP
php获取文件大小的方法
Feb 26 PHP
ThinkPHP中U方法的使用浅析
Jun 13 PHP
PHP解码unicode编码的中文字符代码分享
Aug 13 PHP
php实现简单的上传进度条
Nov 17 PHP
laravel创建类似ThinPHP中functions.php的全局函数
Nov 26 PHP
PHP面向对象程序设计之多态性的应用示例
Dec 19 PHP
PHP数据对象映射模式实例分析
Mar 29 PHP
PHP程序员简单的开展服务治理架构操作详解(一)
May 14 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手机号码归属地查询代码(API接口/mysql)
2012/09/04 PHP
PHP curl 或 file_get_contents 获取需要授权页面的方法
2017/05/05 PHP
论坛特效代码收集(落伍转发-不错)
2006/12/02 Javascript
学习ExtJS Column布局
2009/10/08 Javascript
window.location.hash 使用说明
2010/11/08 Javascript
jQuery表单获取和失去焦点输入框提示效果的实例代码
2013/08/01 Javascript
JQuery实现当鼠标停留在某区域3秒后自动执行
2014/09/09 Javascript
js使用递归解析xml
2014/12/12 Javascript
浅谈Jquery为元素绑定事件
2015/04/27 Javascript
JQuery中Text方法用法实例分析
2015/05/18 Javascript
JS仿百度自动下拉框模糊匹配提示
2016/07/25 Javascript
浅谈EasyUi ComBotree树修改 父节点选择的问题
2016/11/07 Javascript
Vue 按键修饰符处理事件的方法
2018/05/04 Javascript
实例详解vue中的$root和$parent
2019/04/29 Javascript
python抓取并保存html页面时乱码问题的解决方法
2016/07/01 Python
python算法演练_One Rule 算法(详解)
2017/05/17 Python
python中利用队列asyncio.Queue进行通讯详解
2017/09/10 Python
利用Python如何批量修改数据库执行Sql文件
2018/07/29 Python
对python PLT中的image和skimage处理图片方法详解
2019/01/10 Python
python实现简单图片物体标注工具
2019/03/18 Python
python如何实现代码检查
2019/06/28 Python
Python单元测试与测试用例简析
2019/11/09 Python
用sleep间隔进行python反爬虫的实例讲解
2020/11/30 Python
python实现三种随机请求头方式
2021/01/05 Python
IE9下html5初试小刀
2010/09/21 HTML / CSS
Bootstrap 学习分享
2012/11/12 HTML / CSS
HTML5几个设计和修改的页面范例分享
2015/09/29 HTML / CSS
GoPro摄像机美国官网:美国运动相机厂商
2018/07/03 全球购物
幼儿园六一儿童节文艺汇演主持词
2014/03/21 职场文书
个人投资计划书
2014/05/01 职场文书
义和团口号
2014/06/17 职场文书
公安学专业求职信
2014/07/27 职场文书
个人整改措施书面材料
2014/10/24 职场文书
2015年保险业务员工作总结
2015/05/27 职场文书
人力资源部工作计划
2019/05/14 职场文书
为什么在foreach循环中JAVA集合不能添加或删除元素
2021/06/11 Java/Android