用了这么久的php却对php的数据结构不了解哎!真的很差劲!!
先进后出 后进先出
下面展示一些 php操作栈的函数(用法):
$stack = new SplStack();//入栈$stack->push('a');$stack->push('b');//设置迭代模式$stack->setIteratorMode(SplDoublyLinkedList::IT_MODE_LIFO | SplDoublyLinkedList::IT_MODE_DELETE);//设置一个偏移位置的值$stack->offsetSet(0, 'first');//第一个参数 为0 表示的是最后一个元素//出栈//echo $stack->pop().PHP_EOL;//echo $stack->pop().PHP_EOL;//输出结果//first//aprint_r($stack); //测试IteratorMode//输出结果(未时出栈 打印的数据)/*SplStack Object([flags:SplDoublyLinkedList:private] => 7[dllist:SplDoublyLinkedList:private] => Array([0] => a[1] => first))*///其他函数用法$stack->top();//双链表的头部节点$stack->bottom();//双链表的尾部节点$stack->count();//双联表元素的个数$stack->isEmpty();//检测双链表是否为空$stack->key();//当前节点索引$stack->prev();//移到上条记录$stack->next();//移到下条记录$stack->current();//当前记录$stack->rewind();//将指针指向迭代开始处$stack->valid();//检查双链表是否还有节点$stack->offsetExists(0);//指定index处节点是否存在$stack->offsetGet(0);//获取指定index处节点值$stack->offsetSet(0,'first');//设置指定index处值(同上实例)$stack->offsetUnset(0);//删除指定index处节点$stack->pop();//从双链表的尾部弹出元素$stack->push('a');//添加元素到双链表的尾部$stack->serialize();//序列化存储$stack->unserialize($stack->serialize());//反序列化/*** 可见栈和双链表的区别就是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->getIteratorMode();//获取迭代模式SplDoublyLinkedList::IT_MODE_LIFO (Stack style) SplDoublyLinkedList::IT_MODE_FIFO (Queue style)$stack->shift();//双链表的头部移除元素$stack->unshift('a');//双链表的头部添加元素
先进先出 后进后出
下面展示一些 php操作队列的函数(用法):
$queue = new SplQueue();/*** 可见队列和双链表的区别就是IteratorMode改变了而已,栈的IteratorMode只能为:* (1)SplDoublyLinkedList::IT_MODE_FIFO | SplDoublyLinkedList::IT_MODE_KEEP (默认值,迭代后数据保存)* (2)SplDoublyLinkedList::IT_MODE_FIFO | SplDoublyLinkedList::IT_MODE_DELETE (迭代后数据删除)*/$queue->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO | SplDoublyLinkedList::IT_MODE_DELETE);//SplQueue::enqueue()其实就是 SplDoublyLinkedList::push()$queue->enqueue('a');//同$queue->push();$queue->enqueue('b');$queue->enqueue('c');//出列队 方法1//foreach($queue as $item) {// echo $item.PHP_EOL;//}//出列队 方法2//SplQueue::dequeue()其实就是 SplDoublyLinkedList::shift()//同 $queue->shift();for($i=0;$i<$queue->count();$i++){echo $queue->dequeue() . PHP_EOL;//$queue->dequeue();//出队 默认模式是先进先出 可以通过方法setIteratorMode设置}$queue->add(1,'d');//在指定的索引处添加/插入新值$queue->count();//队列数量$queue->bottom();//从队列的第一个开始读取 默认模式是先进先出 读取是的是 “a”$queue->top();//从队列的最后一个开始读取 默认模式是先进先出 读取是的是 “c”$queue->isEmpty();//检查双向链接列表是否为空$queue->current();//获取当前的双链列表节点。$queue->key();//该函数返回当前节点索引$queue->prev();//将迭代器移至上一个节点。$queue->next();//将迭代器移至下一个节点。$queue->offsetExists(0);//获取指定index处节点值$queue->offsetSet(0,'aa');//设置指定index处值(同上实例)$queue->offsetGet(0);//获取指定index处节点值$queue->offsetUnset(0);//删除指定index处节点$queue->pop();//从双链表的尾部弹出元素其他方法可以到PHP 官方文档上查看
SplHeap 是一个抽象类,实现了Iterator , Countable接口。最大堆(SplMaxHeap)和最小堆(SplMinHeap)就是继承它实现
下面展示一些 php操作队列的函数(用法):
下面这个是参考 PHP SplHeap 堆介绍.
abstract SplHeap implements Iterator , Countable {// 创建一个空堆public __construct ( void )// 比较节点大小abstract protected int compare ( mixed $value1 , mixed $value2 )// 返回堆数量public int count ( void )// 返回迭代指针指向的节点public mixed current ( void )// 从堆顶部提取一个节点并重建堆public mixed extract ( void )// 向堆中添加一个节点并重建堆public void insert ( mixed $value )// 判断是否为空堆public bool isEmpty ( void )// 返回迭代指针指向的节点的键public mixed key ( void )// 将迭代器移至上一个节点public void next ( void )// 恢复堆public void recoverFromCorruption ( void )// 重置迭代指针public void rewind ( void )// 和队列相同 返回顶部节点public mixed top ( void )// 判断迭代指针指向的节点是否存在public bool valid ( void )}class iMaxHeap extends SplHeap{/*** 实现compare抽象方法,使用关联数组的值进行比较排序* SplMaxHeap不能满足我们的需求*/public function compare($array1, $array2){$values1 = array_values($array1);$values2 = array_values($array2);if($values1[0] === $values2[0]) return 0;return $values1[0] < $values2[0] ? -1 : 1;}}$heap = new iMaxHeap();
PHP 数据结构
: SplDoublyLinkedList — The SplDoublyLinkedList class
: SplStack — The SplStack class
: SplQueue — The SplQueue class
: SplHeap — TheSplHeap class
: SplMaxHeap — The SplMaxHeap class
: SplMinHeap — The SplMinHeap class
: SplPriorityQueue — The SplPriorityQueue class
: SplFixedArray — The SplFixedArray class
: SplObjectStorage — The SplObjectStorage class
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号