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一日一条

如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例

wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了...

552
来自专栏java一日一条

如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例

wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了...

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

phalapi-入门篇5(数据库操作和Model层)

#phalapi-入门篇5(数据库操作和Model层)# ? ##前言## 先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的开源...

3697
来自专栏林德熙的博客

C# 如何写 DEBUG 输出

经常在代码中,需要使用 DEBUG 来输出一些奇怪的东西来进行测试。但是输出的窗口只有一个,如果有一个逗比在不停输出,那么就会让输出窗口看不到自己的内容。

642
来自专栏杨建荣的学习笔记

物化视图全量刷新与insert的redo生成量测试(69天)

之前的一篇博客中提到,物化视图的全量刷新也是一种高可用性的体现,但是性能如何呢,下面来简单的测试一下。 首先需要创建一个函数,这个函数会计算当前session下...

33311
来自专栏张善友的专栏

Microsoft开源跨平台的序列化库——Bond

上个月Microsoft开源了Bond,一个跨平台的模式化数据处理框架。Bond支持跨语言的序列化/反序列化,支持强大的泛型机制能够对数据进行有效地处理。该框架...

1736
来自专栏更流畅、简洁的软件开发方式

其实添加数据也可以这样简单——表单的第一步抽象(针对数据访问层)《怪怪设计论: 抽象无处不在 》有感

更正: 不好意思,昨天晚上思路有点混乱。有几个前提忘记说明了,现在补充一下。 1、缩小范围。按照由简到难的思路,这里先讨论最简单的添加数据的情况。就是单表的添...

1978
来自专栏数说戏聊

07.时间处理&抽取1.时间处理1.1 字符型转时间型2.时间抽取

411
来自专栏Golang语言社区

Golang语言并发技术详解

有人把Go比作21世纪的C语言,第一是因为Go语言设计简单,第二,21世纪最重要的就是并行程序设计,而Go从语言层面就支持了并行。

4755
来自专栏C/C++基础

Linux下Socket网络编程send和recv使用注意事项

ssize_t send( SOCKET s, const char *buf, size_t len, int flags );

1083

扫码关注云+社区