PHP标准库SPL数据结构

avatar
开发工程师 @西安众邦网络科技有限公司

SPL提供了双向链表、堆栈、队列、堆、降序堆、升序堆、优先级队列、定长数组、对象容器

SplQueue 队列类

进出异端,先进先出 在这里插入图片描述

<?php
$obj = new SplQueue();

//插入一个节点到top位置
$obj->enqueue(1);
$obj->enqueue(2);
$obj->enqueue(3);
/**
SplQueue Object
(
    [flags:SplDoublyLinkedList:private] => 4
    [dllist:SplDoublyLinkedList:private] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )

)
*/
$obj->offsetSet(0,'C');
/**
SplQueue Object
(
    [flags:SplDoublyLinkedList:private] => 4
    [dllist:SplDoublyLinkedList:private] => Array
        (
            [0] => 'C'
            [1] => 2
            [2] => 3
        )

)
*/
$obj->rewind();
//从队列中返回并删除bottom位置的元素
$obj->dequeue();
/**
'C'

SplQueue Object
(
    [flags:SplDoublyLinkedList:private] => 4
    [dllist:SplDoublyLinkedList:private] => Array
        (
            [0] => 2
            [1] => 3
        )

)
*/

SplStack 堆栈类

单端进出时,后进先出,先进后出 在这里插入图片描述

$obj = new SplStack();
/**
SplStack Object
(
    [flags:SplDoublyLinkedList:private] => 6
    [dllist:SplDoublyLinkedList:private] => Array
        (
        )

)
*/
//向堆栈放入一个节点到top位置
$obj->push(1);
$obj->push(2);
$obj->push(3);
/**
SplStack Object
(
    [flags:SplDoublyLinkedList:private] => 6
    [dllist:SplDoublyLinkedList:private] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )

)
*/
//堆栈的offset = 0 是Top所在的位置,offset = 1 是top节点靠近bottom位置的相邻节点
$obj->offsetSet(0,'C');
/**
SplStack Object
(
    [flags:SplDoublyLinkedList:private] => 6
    [dllist:SplDoublyLinkedList:private] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 'C'
        )

)
*/
$obj->offsetSet(1,'B');
/**
SplStack Object
(
    [flags:SplDoublyLinkedList:private] => 6
    [dllist:SplDoublyLinkedList:private] => Array
        (
            [0] => 1
            [1] => 'B'
            [2] => 'C'
        )

)
*/
//堆栈的rewind使指针指向top节点,而双向链表的rewind指向bottom节点
$obj->rewind();
//堆栈的next是使指针向bottom方向相邻的节点移动一位,而链表是向top方向移动
$obj->next();
//遍历堆栈
$obj->rewind();
while($obj->valid()){
    echo $obj->key().'=>'.$obj->current();
    $obj->next();
}
/**
2=>'C'
1=>'B'
0=>1
*/
//从堆栈中取出top位置的节点并删除
$obj->pop();

SplDoublyLinkedList 双向链表类

在这里插入图片描述

$obj = new SplDoublyLinkedList();
//SplDoublyLinkedList Object ( [flags:SplDoublyLinkedList:private] => 0 [dllist:SplDoublyLinkedList:private] => Array ( ) )
//把新的节点数据添加到链表的顶部Top
$obj->push(1);
$obj->push(2);
$obj->push(3);
//把新的节点数据添加到链表底部bottom
$obj->unshift(4);
/**
SplDoublyLinkedList Object
(
    [flags:SplDoublyLinkedList:private] => 0
    [dllist:SplDoublyLinkedList:private] => Array
        (
            [0] => 4
            [1] => 1
            [2] => 2
            [3] => 3
        )

)
*/
//在没有调用rewind()方法之前输出为null
echo 'current'.$obj->current();
//输出: null

//把指针指向bottom节点
$obj->rewind();
//获取当前指针指向的节点
$obj->current();
//输出: 4

//将执行挪到下一个
$obj->next();
$obj->current();
//输出: 1

$obj->prev();
$obj->current();
//输出: 4

//越界了
$obj->next();
$obj->next();
$obj->next();
$obj->next();
$obj->current();
//输出: null

//判断当前节点是否有效
$obj->valid()
//输出: false
$obj->prev();
$obj->valid()
//输出: true
$obj->shift();

//把top节点从链表中删除并返回
$obj->pop();
//输出 3
//把bottom节点从链表中删除并返回
$obj->shift();
//输出 4
//返回top节点
$obj->top();
//返回bottom节点
$obj->bottom();

感谢您的阅读,如果对您有帮助,欢迎关注"CRMEB"。码云上有我们开源的商城项目,知识付费项目,均是基于PHP+vue开发,学习研究欢迎使用,关注我们保持联系!