zoukankan      html  css  js  c++  java
  • 【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();
    
  • 相关阅读:
    C基础之移位操作
    实现itoa()
    Python的time模块的clock方法在不同平台的效果不同
    __stdcall与__cdecl之区别浅析及相关知识
    Python 字典 dictionary changed size during iteration
    Windows下printf输出long long类型
    inotify也会爆棚
    一条对“失控的腾讯帝国:企鹅无法把控手机市场”的评论
    imfunny程序员的增量发展
    程序员第一定律:关于技能和收入
  • 原文地址:https://www.cnblogs.com/nixi8/p/5369935.html
Copyright © 2011-2022 走看看