详解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 相关文章推荐
NOD32 v2.70.32 简体中文封装版 提供下载了
Feb 27 PHP
php REMOTE_ADDR之获取访客IP的代码
Apr 22 PHP
php 抽象类的简单应用
Sep 06 PHP
php循环语句 for()与foreach()用法区别介绍
Sep 05 PHP
php实现图形显示Ip地址的代码及注释
Jan 20 PHP
php截取中文字符串函数实例
Feb 23 PHP
php实现数组按指定KEY排序的方法
Mar 30 PHP
详细解读PHP的Yii框架中登陆功能的实现
Aug 21 PHP
判断、添加和删除WordPress置顶文章的相关PHP函数小结
Dec 10 PHP
Yii2汉字转拼音类的实例代码
Apr 18 PHP
phpStudy2016 配置多个域名期间遇到的问题小结
Oct 19 PHP
PHP安装BCMath扩展的方法
Feb 13 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制作静态网站的模板框架(一)
2006/10/09 PHP
php 上传功能实例代码
2010/04/13 PHP
开发跨浏览器javascript常见注意事项
2009/01/01 Javascript
event.currentTarget与event.target的区别介绍
2012/12/31 Javascript
jQuery基本过滤选择器使用介绍
2013/04/18 Javascript
from 表单提交返回值用post或者是get方法实现
2013/08/21 Javascript
showModalDialog在谷歌浏览器下会返回Null的解决方法
2013/11/27 Javascript
javascript调试之DOM断点调试法使用技巧分享
2014/04/15 Javascript
jQuery浏览器CSS3特写兼容实例
2015/01/19 Javascript
jquery实现TAB选项卡鼠标经过带延迟效果的方法
2015/07/27 Javascript
JavaScript计算某一天是星期几的方法
2015/08/05 Javascript
详解Jquery实现ready和bind事件
2016/04/14 Javascript
js实现放大镜特效
2017/05/18 Javascript
Angular 4依赖注入学习教程之FactoryProvider配置依赖对象(五)
2017/06/04 Javascript
基于Vue生产环境部署详解
2017/09/15 Javascript
three.js加载obj模型的实例代码
2017/11/10 Javascript
浅谈React前后端同构防止重复渲染
2018/01/05 Javascript
NodeJS简单实现WebSocket功能示例
2018/02/10 NodeJs
vuejs 切换导航条高亮(路由菜单高亮)的方法示例
2018/05/29 Javascript
vue.js 中使用(...)运算符报错的解决方法
2018/08/09 Javascript
Vue核心概念Action的总结
2019/01/18 Javascript
从Python的源码浅要剖析Python的内存管理
2015/04/16 Python
Python判断两个list是否是父子集关系的实例
2018/05/04 Python
将Dataframe数据转化为ndarry数据的方法
2018/06/28 Python
python实时获取外部程序输出结果的方法
2019/01/12 Python
python程序运行进程、使用时间、剩余时间显示功能的实现代码
2019/07/11 Python
在Django下测试与调试REST API的方法详解
2019/08/29 Python
Python字符串函数strip()原理及用法详解
2020/07/23 Python
HTML5 localStorage使用总结
2017/02/22 HTML / CSS
C#面试题
2016/05/06 面试题
广州足迹信息技术有限公司Java软件工程师试题
2014/02/15 面试题
String、StringBuffer、StringBuilder有区别
2015/09/18 面试题
医学生自荐信
2013/12/03 职场文书
作风建设年活动实施方案
2014/10/24 职场文书
合同纠纷调解书
2015/05/20 职场文书
环境保护宣传标语大全!
2019/06/28 职场文书