首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP数据结构(四) ——队列

PHP数据结构(四) ——队列

作者头像
用户1327360
发布2018-03-07 10:14:27
1.1K0
发布2018-03-07 10:14:27
举报
文章被收录于专栏:决胜机器学习决胜机器学习

PHP数据结构(四)——队列以及简单消息存取

(原创内容,转载请注明来源,谢谢)

队列也是一种特殊的线性表,和栈很相似,区别在于队列对于数据增加和删除的限制和栈不同,队列是FIFO(先进先出),允许插入的一头叫做队头,允许删除的一头叫做队尾。

下图为队列的基本数据模型。

存在特殊的队列——双端队列,两头都允许增加和删除。另外也有单边只允许插入或者单边只允许删除的特殊队列。

另外,存在一种队列称为循环队列,循环队列头尾相连,只要数据没有超过限制,可以不断的循环使用存储空间。

下图为循环队列的基本数据模型。

队列在程序中运用频发,特别是对于异步消息转发使用较多。即多个请求抵达时,需要逐一执行,即可采用队列方式进行处理。

下列程序简单实现消息保存与处理。

程序运行结果如下:

程序PHP源码如下:

<?php
class queue{
       private$head;
       private$tail;
       private$queuedata;
       private$size;
       //构造队列
       publicfunction __construct($size=10){
              $this->head= 0;
              $this->tail= 0;
              $this->queuedata= array();
              $this->size= $size;
       }
       //初始化队列
       publicfunction init($arr){
              if(count($arr)>$this->size){
                     echo'超出队列长度';
                     returnfalse;               
              }else{
                     foreach($arras $item){
                            $this->queuedata[$this->tail++]= $item;
                     }
                     returntrue;
              }
       }
       //重新分配空间
       publicfunction resize($size){
              if($size<count($this->queuedata)){
                     echo'长度不足';
                     returnfalse;
              }else{
                     $this->size= $size;
                     returntrue;
              }
       }
       //插入队列
       publicfunction push($data){
              if(is_array($data)){
                     $enough= $this->size-count($data)-count($this->queuedata);
                     if($enough<0){
                            echo'插入队列超长';
                            returnfalse;
                     }else{
                            foreach($dataas $item){
                                   $this->queuedata[$this->tail++]= $item;                                 
                            }
                            returntrue;
                     }
              }else{
                     $enough= $this->size-1-count($this->queuedata);
                     if($enough<0){
                            echo'插入队列超长';
                            returnfalse;
                     }else{
                            $this->queuedata[$this->tail++]= $data;
                            returntrue;
                     }                    
              }
       }
       //队列取出
       publicfunction pop(){
              if($this->head==$this->tail){
                     echo'队列为空';
                     returnfalse;
              }else{
                     $data= $this->queuedata[$this->head];
                     unset($this->queuedata[$this->head]);
                     $this->head++;
                     return$data;
              }
       } 
}
//实现消息队列
$myqueue = new queue(20);
//当前一个消息处理器,三个消息发送器
$myqueue->push(array('A m1', 'A m2', 'B m1', 'Cm1', 'C m2'));
$solve1 = $myqueue->pop();
echo '处理器1正在处理:'.$solve1.'<br />';
//此时添加一台处理器处理
$solve2 = $myqueue->pop();
echo '处理器2正在处理:'.$solve2.'<br />';
//处理器1处理完毕后再继续处理队列
$solve1 = $myqueue->pop();
echo '处理器1正在处理:'.$solve1.'<br />';

该方法只是简单实现消息存储与取出,完整版消息队列、MQ等将在后续文章中推出。

——written by linhxx 2017.06.16

相关阅读:

PHP数据结构(三)——运用栈实现括号匹配

PHP数据结构(二)——链式结构线性表

PHP数据结构(一)——顺序结构线性表

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 决胜机器学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档