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

相关文章

来自专栏BeJavaGod

使用Spring ThreadPoolTaskExecutor实现多线程任务

我们为何使用多线程,之前已经有讲过了,为了更快的处理多个任务,分割任务,或者调用多个毫无关联的第三方服务 其实spring就提供了ThreadPoolTask...

3045
来自专栏Android 研究

Android跨进程通信IPC之2——Bionic

Bionic库是Android的基础库之一,也是连接Android系统和Linux系统内核的桥梁,Bionic中包含了很多基本的功能模块,这些功能模块基本上都是...

583
来自专栏Golang语言社区

Go语言基于共享变量的并发

一个特定类型的方法和操作函数是并发安全的,那么所有它的访问方法和操作都是并发安全的。导出包级别的函数一般情况下都是并发安全的,package级的变量没法被限制在...

2534
来自专栏大魏分享(微信公众号:david-share)

内存虚拟化技术介绍之---内存去重

前言 虚拟化的目的是为了提升硬件的资源利用率,包括CPU,内存、IO等。在各种虚拟化中,都有内存压缩、内存去重等技术。本文通过介绍PowerVM的内存去重技术,...

3798
来自专栏Vamei实验室

Python标准库06 子进程 (subprocess包)

这里的内容以Linux进程基础和Linux文本流为基础。subprocess包主要功能是执行外部的命令和程序。比如说,我需要使用wget下载文件。我在Pytho...

2146
来自专栏IT技术精选文摘

攻破JAVA NIO技术壁垒

现在使用NIO的场景越来越多,很多网上的技术框架或多或少的使用NIO技术,譬如Tomcat,Jetty。学习和掌握NIO技术已经不是一个Java攻城狮的加分技能...

1917
来自专栏女程序员的日常

STM8S——Universal asynchronous receiver transmitter (UART)

UART基本介绍: 通用异步收发器UART他的功能非常强大 我们只使用UART的全双工异步通信功能,使用中断接收数据。 UART_RX:串行数据输入。 UART...

2001
来自专栏流媒体

Linux下Socket编程(四)——epoll的使用简介

相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,...

702
来自专栏逆向技术

远程线程注入

一丶远程线程注入的讲解 远程线程注入的原理,我会写一个远程线程开发的例子 我们总共需要几步 /*1.查找窗口,获取窗口句柄*/ /*2.根据...

18810
来自专栏扎心了老铁

EsRejectedExecutionException排错与线程池类型

1、EsRejectedExecutionException异常示例 java.util.concurrent.ExecutionException: Remo...

3524

扫描关注云+社区