详解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 相关文章推荐
将数字格式的计算结果转为汉字格式
Oct 09 PHP
PHP一些常用的正则表达式字符的一些转换
Jul 29 PHP
PHP setcookie设置Cookie用法(及设置无效的问题)
Jul 13 PHP
php启用zlib压缩文件的配置方法
Jun 12 PHP
php实现递归抓取网页类实例
Apr 03 PHP
Symfony2框架学习笔记之HTTP Cache用法详解
Mar 18 PHP
Yii2实现跨mysql数据库关联查询排序功能代码
Feb 10 PHP
PHP7如何开启Opcode打造强悍性能详解
May 11 PHP
使用PHP开发留言板功能
Nov 19 PHP
PHP接入支付宝接口失效流程详解
Nov 10 PHP
WordPress多语言翻译插件 - WPML使用教程
Apr 01 PHP
详解thinkphp的Auth类认证
May 28 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
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
2010/02/16 PHP
php中mkdir函数用法实例分析
2014/11/15 PHP
浅谈php正则表达式中的非贪婪模式匹配的使用
2014/11/25 PHP
浅谈json_encode用法
2015/03/05 PHP
php实现RSA加密类实例
2015/03/26 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
2016/05/07 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
js计数器代码
2006/11/04 Javascript
限制文本字节数js代码
2007/03/06 Javascript
javascript权威指南 学习笔记之变量作用域分享
2011/09/28 Javascript
JavaScript获取FCK编辑器信息的具体方法
2013/07/12 Javascript
解决js中window.open弹出的是上次的缓存页面问题
2013/12/29 Javascript
js replace替换所有匹配的字符串
2014/02/13 Javascript
jQuery+CSS3实现树叶飘落特效
2015/02/01 Javascript
js实现水平滚动菜单导航
2017/07/21 Javascript
AngualrJs清除定时器遇到的坑
2017/10/13 Javascript
详解微信小程序中组件通讯
2018/10/30 Javascript
浅谈Vue数据响应
2018/11/05 Javascript
three.js利用卷积法如何实现物体描边效果
2019/11/27 Javascript
js实现树形数据转成扁平数据的方法示例
2020/02/27 Javascript
RxJS在TypeScript中的简单使用详解
2020/04/13 Javascript
vue 动态添加class,三个以上的条件做判断方式
2020/11/02 Javascript
python动态参数用法实例分析
2015/05/25 Python
500行Python代码打造刷脸考勤系统
2019/06/03 Python
Python图像处理之图片文字识别功能(OCR)
2019/07/30 Python
在Python IDLE 下调用anaconda中的库教程
2020/03/09 Python
基于python实现数组格式参数加密计算
2020/04/21 Python
Python实现进度条和时间预估的示例代码
2020/06/02 Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
2020/11/05 Python
Python中logging日志的四个等级和使用
2020/11/17 Python
python读取图片颜色值并生成excel像素画的方法实例
2021/02/19 Python
使用phonegap创建联系人的实现方法
2017/03/30 HTML / CSS
html5 canvas合成海报所遇问题及解决方案总结
2017/08/03 HTML / CSS
2014年青年志愿者工作总结
2014/12/09 职场文书
中学感恩教育活动总结
2015/05/05 职场文书
浅谈MySQL之浅入深出页原理
2021/06/23 MySQL