下面使用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数据结构实现队列的示例代码的详细内容。
