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

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数据结构(一)——顺序结构线性表

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-06-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java工程师日常干货

纯手写实现JDK动态代理前言JDK动态代理 手写代码实现JDK动态代理

在Java领域,动态代理应用非常广泛,特别是流行的Spring/MyBatis等框架。JDK本身是有实现动态代理技术的,不过要求被代理的类必须实现接口,不过cg...

862
来自专栏xingoo, 一个梦想做发明家的程序员

图解NodeJS【基于事件、回调的单线程高性能服务器】原理

刚开始了解Node感觉很吊,各种说高性能,可是一直不理解为什么单线程会比多线程快?为什么异步IO比非阻塞IO快?因此,本篇在阅读相关书籍后,根据自己的理解,整...

1987
来自专栏java一日一条

同步和异步的区别

答案一: 1.异步传输 通常,异步传输是以字符为传输单位,每个字符都要附加 1 位起始位和 1 位停止位,以标记一个字符的开始和结束,并以此实现数据传输同步...

692
来自专栏数据之美

关于 rsync 中: 和 :: 及 rysnc 和 ssh 认证协议的区别

今天上午同事问我  rsync -av /SRC root@172.17.256.211:36000::/DEST 为何报 port 22 refused...

2859
来自专栏喵了个咪的博客空间

phalcon-入门篇5(请求与返回)

#phalcon-入门篇5(请求与返回)# ? 本教程基于phalcon2.0.9版本 ##前言## 先在这里感谢各位phalcon技术爱好者,我们提供这样一个...

38213
来自专栏Java技术分享

30天轻松掌握JavaWeb-学习目录

17.使用beanUtils操纵javabean

2516
来自专栏熊二哥

快速入门系列--WCF--02消息、会话与服务寄宿

经过WCF基础的ABC学习,已经可以构建简单的WCF的服务,使用不同的服务地址和绑定类型,根据业务提供所需的服务契约。但不禁想问,服务所使用的消息报文是什么样的...

2045
来自专栏北京马哥教育

【翻译】Python async/await Tutorial

原文链接: http://stackabuse.com/python-async-await-tutorial/ 过去几年,异步编程方式被越来越多的程序员使用,...

3055
来自专栏码洞

求不更学不动之Redis5.0新特性Stream尝鲜

Redis5.0最近被作者突然放出来了,增加了很多新的特色功能。而Redis5.0最大的新特性就是多出了一个数据结构Stream,它是一个新的强大的支持多播的可...

1566
来自专栏Java进阶架构师

手把手带你实现JDK动态代理

业务接口Interface、业务实现类target、业务处理类Handler、JVM在内存中生成的动态代理类$Proxy0

762

扫码关注云+社区