队列是一种特殊的线性表,遵循先进先出原则,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
下面是SplQueue类的实现:
<?php
/**
* SplQueue继承自SplDoublyLinkedList,关于SplDoublyLinkedList请查看之前的文章
*
* @since PHP 5.3
* @link http://blog.csdn.net/wuxing26jiayou/article/details/51862707
*/
class SplQueue extends SplDoublyLinkedList
{
protected $_it_mode = parent::IT_MODE_FIFO;
/**
* - SplQueue允许使用两种迭代模式
* - SplDoublyLnkedList::IT_MODE_FIFO | SplDoublyLnkedList::IT_MODE_KEEP
* - SplDoublyLnkedList::IT_MODE_FIFO | SplDoublyLnkedList::IT_MODE_DELETE
*
* 默认的模式是 : SplDoublyLnkedList::IT_MODE_FIFO | SplDoublyLnkedList::IT_MODE_KEEP
* @param $mode
*/
public function setIteratorMode($mode)
{
if ($mode & parent::IT_MODE_LIFO === parent::IT_MODE_LIFO) {
throw new RuntimeException("Iterators' LIFO/FIFO modes for SplStack/SplQueue objects are frozen");
}
$this->_it_mode = $mode;
}
/**
* 取出队列头部的成员
*
* @note dequeue方法等效于父类shift方法
* @see splDoublyLinkedList::shift()
*/
public function dequeue()
{
return parent::shift();
}
/**
* 往队列尾部添加成员
*
* @note dequeue方法等效于父类push方法
* @see splDoublyLinkedList::push()
*/
public function enqueue($data)
{
return parent::push($data);
}
}
?>
例子说明:
<?php
class Test {
public static function foo() {
echo 'Test::foo() called'.'<br/>';
}
public static function bar() {
echo 'Test::bar() called'.'<br/>';
}
public static function msg($msg) {
echo "$msg".'<br/>';
}
}
$queue = new SplQueue();
$queue->setIteratorMode(SplQueue::IT_MODE_DELETE);
$queue->enqueue(array("Test", "foo"));
$queue->enqueue(array("Test", "bar"));
$queue->enqueue(array("Test", "msg", "Hi there!"));
foreach ($queue as $task) {
if (count($task) > 2) {
list($class, $method, $args) = $task;
$class::$method($args);
} else {
list($class, $method) = $task;
$class::$method();
}
}
?>
Test::foo() called
Test::bar() called
Hi there!