详解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模板引擎SMARTY
Oct 09 PHP
如何在PHP中使用Oracle数据库(5)
Oct 09 PHP
使用swoole扩展php websocket示例
Feb 13 PHP
php实现天干地支计算器示例
Mar 14 PHP
通过curl模拟post和get方式提交的表单类
Apr 23 PHP
PHP在网页中动态生成PDF文件详细教程
Jul 05 PHP
Yii核心组件AssetManager原理分析
Dec 02 PHP
php使用Session和文件统计在线人数
Jul 04 PHP
php脚本运行时的超时机制详解
Feb 17 PHP
php实现的简单中文验证码功能示例
Jan 03 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
Sep 16 PHP
Laravel框架实现定时Task Scheduling例子
Oct 22 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 数组之count 函数
2016/06/13 PHP
Thinkphp框架+Layui实现图片/文件上传功能分析
2020/02/07 PHP
javascript学习笔记(十) js对象 继承
2012/06/19 Javascript
在jQuery中 常用的选择器介绍
2013/04/16 Javascript
jQuery1.9.1针对checkbox的调整方法(prop)
2014/05/01 Javascript
jQuery中unbind()方法用法实例
2015/01/19 Javascript
Javascript数据结构与算法之列表详解
2015/03/12 Javascript
JQuery中节点遍历方法实例
2015/05/18 Javascript
JavaScript中模拟实现jsonp
2015/06/19 Javascript
vue.js+boostrap项目实践(案例详解)
2016/09/21 Javascript
关于js函数解释(包括内嵌,对象等)
2016/11/20 Javascript
浅谈jquery选择器 :first与:first-child的区别
2016/11/20 Javascript
详解jQuery中的DOM操作
2016/12/23 Javascript
JS实现二叉查找树的建立以及一些遍历方法实现
2017/04/17 Javascript
openlayers 3实现车辆轨迹回放
2020/09/24 Javascript
[01:32]2014DOTA2西雅图邀请赛 CIS我们有信心进入正赛
2014/07/08 DOTA
win7上python2.7连接mysql数据库的方法
2017/01/14 Python
浅谈django的render函数的参数问题
2018/10/16 Python
Python3解释器知识点总结
2019/02/19 Python
python使用 zip 同时迭代多个序列示例
2019/07/06 Python
python中if及if-else如何使用
2020/06/02 Python
python和js交互调用的方法
2020/06/23 Python
使用python修改文件并立即写回到原始位置操作(inplace读写)
2020/06/28 Python
用缩写的指针比较"if(p)" 检查空指针是否可靠?如果空指针的内部表达不是0会怎么样?
2014/01/05 面试题
实体的生命周期
2013/08/31 面试题
Java模拟试题
2014/11/10 面试题
师范应届生教师求职信
2013/11/05 职场文书
模范家庭事迹材料
2014/02/10 职场文书
大二学生自我检讨书
2014/10/23 职场文书
全国法制宣传日活动总结2014
2014/11/01 职场文书
感谢信模板大全
2015/01/23 职场文书
农业项目投资意向书
2015/05/09 职场文书
2016七夕情人节感言
2015/12/09 职场文书
中学语文教学反思
2016/02/16 职场文书
Kubernetes控制节点的部署
2022/04/01 Servers
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
2022/08/14 MySQL