一:SPL中的双向链表---SplDoublyLinkedList()
- 双向链表的操作总结
- 当前节点的操作:rewind() 指向bottom,current() 当前节点,next() 下一个节点,prev() 上一个节点。
- 增加节点的操作:push()会插入到top、unshift()会插入到bottom。
- 删除节点的操作:pop() 会删除节点中的top元素、shift() 会删除节点中的bottom元素
- 定位操作:bottom()、top()
- 特定节点的操作:offsetExsits()、offsetGet()、offsetSet()、offsetUnset()
- SplDoublyLinkedList的实现
1 <?php 2 $obj=new SplDoublyLinkedList(); 3 $obj->push(1); 4 $obj->push(2); 5 $obj->push(3); 6 $obj->unshift(10);//在bottom添加 7 $obj->shift(); //在bottom删除 8 // $obj->pop(); 9 $obj->rewind();//在调用current等操作前需要调用rewind() 10 $obj->next(); //从bottom到top 11 echo "current:".$obj->current(); //current:2 12 $obj->prev(); 13 echo "current:".$obj->current(); //current:1 14 $obj->prev(); 15 echo "current:".$obj->current(); //current:(指向空节点)
二:SPL中的堆栈---SplStack()
SPL的堆栈就像一个圆盘,要想把3拿出来,必须把5、7都拿出来。先进后出。
具有先进后出特性的成为堆栈。SplStack继承自SplDoublyLinkedList类、具有父类的一切方法。
注意点:
- offset 中,0为top所在的节点。(offset总是最先出来的节点)
- current() 在双向链表中指向bottom位置,在堆栈指向top位置。
- next()在双向链表由bottom()指向top(),在堆栈中由top()指向bottom()
- pop()从top删除。同双向链表。
1 <?php 2 $stack = new SplStack(); 3 $stack->push("A"); 4 $stack->push("B"); 5 $stack->offsetSet(0, "C");//B的值设为C 6 //遍历堆栈 7 $stack->rewind(); 8 while ($stack->valid()){ 9 echo $stack->key()."=>".$stack->current()."<br>"; 10 $stack->next(); 11 }//1=>c 0=>A 12 $stack->pop(); 13 print_r($stack);//SplStack Object ( [flags:SplDoublyLinkedList:private] => 6 [dllist:SplDoublyLinkedList:private] => Array ( [0] => A ) )
三:SPL中的队列---SplQueue()
队列和堆栈正好相反,最先进入队列的元素会先出队列。
类比于排队打饭,排到最前面的人总是最先能够打到饭。
继承自SplDoublyLinkedList()
进入队列:enqueue()进入队列 dequeue()退出队列
注意点:
- offset 中,0为bottom所在的节点。(offset总是最先出来的节点)
- current() 在双向链表中指向bottom位置,在队列指向bottom位置。
- next()在双向链表由bottom()指向top(),在队列由bottom()指向top()。
- dequeue()删除bottom()节点。
1 <?php 2 $queue=new SplQueue(); 3 $queue->enqueue(1); 4 $queue->enqueue(2); 5 $queue->enqueue(3); 6 $queue->dequeue();//1会退出队列 7 $queue->offsetSet(0, "b"); 8 $queue->rewind(); 9 echo "current:".$queue->current();//b