PHP SPL标准库
用了这么久的php却对php的数据结构不了解哎!真的很差劲!!
SplStack(栈)
先进后出 后进先出
下面展示一些 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
//a
print_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');//双链表的头部添加元素
SplQueue(队列)
先进先出 后进后出
下面展示一些 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(堆)
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