PHP SplQueue 队列简介

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

下面是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!



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值