数据结构随笔-php实现队列
队列(Queue): 满足先进先出(FIFO)的规则;
下面使用php实现一个简单的循环队列模型;
初始状态的队列,队列长度为0,队头和队尾的指针相同均位于队列的开始;
入队操作:队尾指针向后移动,长度加一;
出队操作:队头指针向后移动,长度减一;
循环队列特点:队列大小固定,队列所开辟的内存空间可循环使用,指针的移动是靠与queueSize取余运算移动;
下面的例子是利用数组实现队列存储,数组下标作为指针;
<?php /**
* Class Queue
*/
class Queue
{
/**
* @var int 队头指针
*/
private $_front; /**
* @var int 队尾指针
*/
private $_rear; /**
* @var array 队列数组
*/
private $_queue; /**
* @var int 队列实际长度
*/
private $_queueLength; /**
* @var int 队列容量;
*/
private $_queueSize; /**
* Queue constructor.初始化队列
* @param int $capacity 容量(循环队列的最大长度)
*/
public function __construct($size)
{
$this->_queue = [];
$this->_queueSize = $size;
$this->_front = 0;
$this->_rear = 0;
$this->_queueLength = 0;
} /**
* 销毁队列;
*/
public function __destruct()
{
unset($this->_queue);
} /**
* @method 入队
* @param mixed $elem 入队的元素
* @return bool
*/
public function enQueue($elem)
{
if (!$this->isFull()) {
$this->_queue[$this->_rear] = $elem;
$this->_rear++;
$this->_rear = $this->_rear % $this->_queueCapacity;
$this->_queueLength++;
return true;
}
return false;
} /**
* @method 出队
* @return mixed|null
*/
public function deQueue()
{
if (!$this->isEmpty()) {
$elem = $this->_queue[$this->_front];
//unset($this->_queue[$this->_front]);
$this->_front++;
$this->_front %= $this->_queueCapacity;
$this->_queueLength--;
return $elem;
}
return null;
} /**
* @method 判断队列是否为空;
* @return bool
*/
public function isEmpty()
{
return $this->_queueLength === 0;
} /**
* @method 判断队列是否饱和;
* @return bool
*/
public function isFull()
{
return $this->_queueLength === $this->_queueCapacity;
} /**
* @method 遍历队列并输出(测试队列)
*/
public function outputQueue()
{
for ($i = $this->_front; $i < $this->_queueLength + $this->_front; $i++) {
echo $this->_queue[$i % $this->_queueCapacity].PHP_EOL;
}
} /**
* @method 清空队列
*/
public function clearQueue()
{
$this->_queue = [];
$this->_front = 0;
$this->_rear = 0;
$this->_queueLength = 0;
}
}
测试队列类,讲道理是没什么大问题的,优化就靠真实的业务场景了;
$a = new Queue(3);
echo 'enQueue1 $a->enQueue(1)'.PHP_EOL;
$a->enQueue(1);
echo 'enQueue2 $a->enQueue(2)'.PHP_EOL;
$a->enQueue(2);
echo 'enQueue3 $a->enQueue(3)'.PHP_EOL;
$a->enQueue(3);
echo 'enQueue4 $a->enQueue(4)'.PHP_EOL;
$a->enQueue(4); //讲道理是失败的;
$a->outputQueue(); //输出 1 2 3
echo PHP_EOL;
echo PHP_EOL;
echo $a->deQueue(); //输出 1 队列 2 3
echo PHP_EOL;
echo PHP_EOL;
echo $a->deQueue(); //输出 2 队列 3
$a->enQueue(5); //队列 3 5
echo PHP_EOL;
echo PHP_EOL;
$a->outputQueue(); //输出 3 5
$a->clearQueue(); //队列空;
如有不对,敬请指教
数据结构随笔-php实现队列的更多相关文章
- 学习javascript数据结构(一)——栈和队列
前言 只要你不计较得失,人生还有什么不能想法子克服的. 原文地址:学习javascript数据结构(一)--栈和队列 博主博客地址:Damonare的个人博客 几乎所有的编程语言都原生支持数组类型,因 ...
- python数据结构之栈与队列
python数据结构之栈与队列 用list实现堆栈stack 堆栈:后进先出 如何进?用append 如何出?用pop() >>> >>> stack = [3, ...
- php数据结构课程---3、队列(队列实现方法)
php数据结构课程---3.队列(队列实现方法) 一.总结 一句话总结: 1.数据实现:适用于功能不复杂的情况 2.链表实现:受限链表,只能队头队尾操作:适用于功能复杂情况 1.队列的数组实现注意点? ...
- 我理解的数据结构(三)—— 队列(Queue)
我理解的数据结构(三)-- 队列(Queue) 一.队列 队列是一种线性结构 相比数组,队列对应的操作是数组的子集 只能从一端(队尾)添加元素,只能从另一端(队首)取出元素 队列是一种先进先出的数据结 ...
- 数据结构之双端队列(Deque)
1,双端队列定义 双端队列:其两端都可以入列和出列的数据结构,如下图所示,队列后面(rear)可以加入和移出数据,队列前面(front)可以加入和移出数据 双端队列操作: deque=Deque() ...
- php数据结构课程---7、队列实战
php数据结构课程---7.队列实战 一.总结 一句话总结: 注意条件:注意循环的条件(比如while循环打印队列元素时),注意if的条件 把问题想清楚:比如链表操作初次插入元素和后面再插,效果是不一 ...
- Python实现的数据结构与算法之队列详解
本文实例讲述了Python实现的数据结构与算法之队列.分享给大家供大家参考.具体分析如下: 一.概述 队列(Queue)是一种先进先出(FIFO)的线性数据结构,插入操作在队尾(rear)进行,删除操 ...
- JavaScript 数据结构与算法2(队列和双端队列)
学习数据结构的 git 代码地址: https://gitee.com/zhangning187/js-data-structure-study 1.队列和双端队列 队列和栈非常类似,但是使用了与 后 ...
- [数据结构]——链表(list)、队列(queue)和栈(stack)
在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...
随机推荐
- python 标准库 -- configparser
configparser 用于处理 ini 格式的配置文件, 其本质上是利用 open 来操作文件. 示例文件 : [zhangsan] name = zhangsan age = 12 job = ...
- Java+XSL合并多个XML文件
使用 Java 解析 XML 文件有许多成熟的工具,如 dom4j 等等.但在一些场景中,我们可能使用 Ant.Maven 等构建工具对多个 XML 文件进行合并,我们希望可以直接通过脚本文件,或者简 ...
- PHP二维数组合并,根据某个key合并
/** *PHP二维数组合并,根据某个key合并 * @param type $v 要传入的组合阵列 * @param type $keyname 对应的KEY名称. * @param type $v ...
- Chapter 1. Introduce
前言 本书全名是<H.264 and MPEG-4 Video Compression, Video Coding For Next-generation Multimedia>,作者为 ...
- js 、jq强化复习
JavaScript 显示数据 JavaScript 可以通过不同的方式来输出数据: 使用 window.alert() 弹出警告框. 使用 document.write() 方法将内容写到 HTML ...
- RabbitMQ系列教程之五:主题(Topic)
(本实例都是使用的Net的客户端,使用C#编写),说明,中文方括号[]表示名词. 在上一个教程中,我们改进了我们的日志记录系统. 没有使用只能够进行虚拟广播的[Fanout]交换机,而是使用了[D ...
- nodejs模块学习: connect2解析
nodejs模块学习: connect2 解析 nodejs 发展很快,从 npm 上面的包托管数量就可以看出来.不过从另一方面来看,也是反映了 nodejs 的基础不稳固,需要开发者创造大量的轮子来 ...
- ES6的转换器
---恢复内容开始--- ES6代码转为ES5代码的转换器 1.Babel 2.Traceur,Google公司出品 Babel是一个广泛使用的ES6转码器,可以将ES6代码转为ES5代码,从而在现有 ...
- OpenCV 之 图像分割 (一)
1 基于阈值 1.1 基本原理 灰度阈值化,是最简单也是速度最快的一种图像分割方法,广泛应用在硬件图像处理领域 (例如,基于 FPGA 的实时图像处理). 假设输入图像为 f,输出图像为 g,则经 ...
- AngularJS实用基础知识---入门必备
前言 今天来和大家学习一下AngularJS-- AngularJS 通过新的属性和表达式扩展了 HTML. AngularJS 可以构建一个单一页面应用程序. AngularJS 学习起来非常简单. ...