数据结构随笔-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)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...
随机推荐
- JavaScript 创建一个 form 表单并提交
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...
- 数据库外连接及MySQL实现
MySQL查询分为内连接查询和外连接查询,他们的区别在于:内连接查询的两个表示对等关系,根据条件进行匹配:外连接是以某一个表为主,两一个表根据条件进行关联.外连接分为左外连接.右外连接和全外连接.本文 ...
- Mathematica学习笔记2
导入文件中的矩阵 mat = Import["...", "Table"] 转化为向量矩阵(元素为数对) data = Table[{mat[[i, j]], ...
- HTML5 Web SQL 数据库操作
Web SQL 数据库 API 并不是 HTML5 规范的一部分,但是它是一个独立的规范,引入了一组使用 SQL 操作客户端数据库的 APIs. 以下是规范中定义的三个核心方法: openDataba ...
- pandas教程1:pandas数据结构入门
pandas是一个用于进行python科学计算的常用库,包含高级的数据结构和精巧的工具,使得在Python中处理数据非常快速和简单.pandas建造在NumPy之上,它使得以NumPy为中心的应用很容 ...
- 网络编程学习笔记(二)基于TCP的Socket编程
1.Socket:英文意思插座.两个Java应用程序可以通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个Socket. 2.Socket通常用来实现client-server(客户端 ...
- android源码、博文2
每周精选 第 54 期 精品源码 仿网易新闻app下拉标签选择菜单 仿网易新闻app下拉标签选择菜单,长按拖动排序,点击增删标签控件##示例 https://github.com/we ...
- POWERSHELL将域中的计算机移动到指定OU
POWERSHELL处理域中计算机的过程 由于集团公司规模较大,存在几个分公司并处在不同地理位置.采用域集中管理,各分公司都有自己的域控制器,分别负责各分公司的DNS解析,DHCP地址分配,及客户端登 ...
- jQuery手风琴的制作!!
jQuery手风琴的制作 首先我们先来做一个简单的jQuery的效果图 效果图 如下: css代码 如下: <style type="text/css" media=&quo ...
- org.apache.jasper.JasperException: - Page directive must not have multiple occurrences of pageencoding
最近写jsp遇到一系列的低级错误,记录下来权当前车之鉴吧. 错误提示: SEVERE: Servlet.service() for servlet jsp threw exceptionorg.apa ...