这两个类都是继承自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();