PHP数据结构(四) ——队列
时间:2022-05-03
本文章向大家介绍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
相关阅读:
- js 判断user agent
- linux下查看所有用户及所有用户组
- Linux给用户添加sudo权限
- 博弈论入门之威佐夫博弈
- jQuery插件 -- Form表单插件jquery.form.js
- PHP验证手机号码和归属地 PHP函数代码
- 浅谈PHP 5中垃圾回收算法的演化
- POJ 2484 A Funny Game(智商博弈)
- php pathinfo()的用法
- BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏(SG函数)
- 微信公众平台开发
- BZOJ 1115: [POI2009]石子游戏Kam (阶梯nim)
- php性能监测模块XHProf
- BZOJ 1022: [SHOI2008]小约翰的游戏John (Anti-nim)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Go语言(十二)web编程
- Go语言入门(十一) 接口编程
- 一个价值百万的思路,如何下载去水印视频
- Go语言入门(十) Mysql与Redis操作
- 【Vue进阶】——如何实现组件属性透传?
- Go语言入门(九) 文件操作
- zookeeper完整详细版
- redis学习(十九)
- Android开发6年,互联网寒冬公司倒闭后,耗时3个月北上广求职,终拿到头条Offer!
- 直播软件开发如何使用FFMPEG推流并保存在本地
- react-router学习笔记
- 尤大 3 天前发在 GitHub 上的 vue-lit 是啥?
- BFE.dev前端刷题 23. 实现一个sum()方法
- 彻底深刻理解js原型链之prototype,proto以及constructor(一)
- SAP Spartacus取cart的HTTP请求