• 【SPL标准库专题(5)】 Datastructures:SplStack & SplQueue


    这两个类都是继承自SplDoublyLinkedList,分别派生自SplDoublyLinkedList的堆栈模式和队列模式;所以放在一起来介绍;

    堆栈SplStack

    3846779171.jpg-31.4kB

    # 类摘要
    SplStack extends SplDoublyLinkedList implements Iterator , ArrayAccess , Countable {
      /* 方法 */
      __construct(void)
      
      // 重写了父类SplDoublyLinkedList,固定为堆栈模式,然后此处只需要传IT_MODE_DELETE或者IT_MODE_KEEP。
      void setIteratorMode(int $mode )
     
      /* 继承自SplDoublyLinkedList的方法 */
      ...
     }
    
    //把栈想象成一个颠倒的数组
    $stack = new SplStack();
    /**
     * 可见栈和双链表的区别就是IteratorMode改变了而已,栈的IteratorMode只能为:
     * (1)SplDoublyLinkedList::IT_MODE_LIFO | SplDoublyLinkedList::IT_MODE_KEEP  (默认值,迭代后数据保存)
     * (2)SplDoublyLinkedList::IT_MODE_LIFO | SplDoublyLinkedList::IT_MODE_DELETE (迭代后数据删除)
     */
    $stack->setIteratorMode(SplDoublyLinkedList::IT_MODE_LIFO | SplDoublyLinkedList::IT_MODE_DELETE);
    $stack->push('a');
    $stack->push('b');
    $stack->push('c');
    $stack->offsetSet(0, 'first');//index 为0的是最后一个元素,后入后出
    $stack->pop(); //出栈
    foreach($stack as $item) {
      echo $item . PHP_EOL; // first a
    }
    print_R($stack); //测试IteratorMode
    

    队列SplQueue

    804515552.png-10.1kB

     # 类摘要
     SplQueue extends SplDoublyLinkedList implements Iterator , ArrayAccess , Countable {
        /* 方法 */
        __construct ( void )
        
        // 出队
        mixed dequeue ( void )
        
        // 入队
        void enqueue ( mixed $value )
        
        // 重写了父类SplDoublyLinkedList,固定为堆栈模式,然后此处只需要传IT_MODE_DELETE或者IT_MODE_KEEP。
        void setIteratorMode ( int $mode )
        
        //其他继承的方法
     }
    
    $q = new SplQueue();
    
    $q->setIteratorMode(SplQueue::IT_MODE_DELETE);
    
    //可以放任何数据类型到队列里面
    $q->enqueue('item1');
    //每次放入都是只占一个队列的位置
    $q->enqueue(array("FooBar", "foo"));
    $q->enqueue(new stdClass());
    
    
    $q->rewind();
    while($q->valid()){
      print_r($q->current());
      echo "
    ";
      $q->next();
    }
    
    // 出队,先入先出,因为队列为空,所以此处报错;
    $q->dequeue();
    
  • 相关阅读:
    rapidjson 使用
    【设计模式】模板方法模式
    【设计模式】策略模式
    【设计模式】建造者模式
    【设计模式】享元模式
    /dev/sda1 contains a file system with errors,check forced.
    如何编写高效的Python的代码
    VsCode 调试 Python 代码
    Python 使用 pyinstaller 打包 代码
    初次使用git上传代码到github远程仓库
  • 原文地址:https://www.cnblogs.com/nixi8/p/5369935.html
Copyright © 2020-2023  润新知