PHP SplQueue 队列简介

来源:互联网 发布:结构设计软件 编辑:程序博客网 时间:2024/06/17 08:21

队列是一种特殊的线性表,遵循先进先出原则,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

下面是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);    }}?>

例子说明:

<?phpclass 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!



1 0
原创粉丝点击