這兩個類都是繼承自SplDoublyLinkedList
,分別派生自SplDoublyLinkedList
的堆棧模式和隊列模式;因此放在一塊兒來介紹;php
# 類摘要 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 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();