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
相关阅读: