SPL标准库专题6DatastructuresSplStack-SplQueue

33次阅读

共计 1441 个字符,预计需要花费 4 分钟才能阅读完成。

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

堆栈 SplStack

# 类摘要
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

 # 类摘要
 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 "\n";
  $q->next();}

// 出队,先入先出, 因为队列为空,所以此处报错;
$q->dequeue();

正文完
 0