PHP的中的数据结构

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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值