php实现队列数据结构
发布时间:2017-08-07, 15:13:33 分类:PHP | 编辑 off 网址 | 辅助
正文 3446字数 146,098阅读
队列(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;
}
}
Run code
Cut to clipboard
测试队列类,讲道理是没什么大问题的,优化就靠真实的业务场景了;
$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(); //队列空;
Run code
Cut to clipboard
(支付宝)给作者钱财以资鼓励 (微信)→
暂无评论 »