SPL 数据结构1-双向链表,堆栈,队列

Posted tim_xiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SPL 数据结构1-双向链表,堆栈,队列相关的知识,希望对你有一定的参考价值。

php中,spl扩展提供了一些常用的数据结构供我们使用。只是由于php中存在万能的数组,所以对于数据结构的认识以及相关数据结构的使用会比较少。以下整理梳理了spl中提供的一些数据结构以及使用说明,使我们对于相关数据结构以及基本使用有一定认知。
这一篇中将介绍 双向链表,堆栈 和 队列。

双向链表

以下为百度百科中对于双向链表的解释


双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。

php spl中,提供了SplDoublyLinkedList用于实现双向列表,下面代码列出一些常用的功能

$list = new SplDoublyLinkedList();
$list->push(\'a\');
$list->push(\'b\');
$list->push(\'c\');
$list->push(\'d\');

echo "链表长度:" . count($list) . PHP_EOL;

$list->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO);
echo "FIFO :\\n";
for ($list->rewind(); $list->valid(); $list->next()) {
    echo $list->current() . "\\n";
}

$list->setIteratorMode(SplDoublyLinkedList::IT_MODE_LIFO);
echo "FILO :\\n";
for ($list->rewind(); $list->valid(); $list->next()) {
    echo $list->current() . "\\n";
}

// 双向链表常用方法
echo "链表头部元素:" . $list->bottom() . PHP_EOL;
echo "链表尾部元素:" . $list->pop() . PHP_EOL;

$list->push("在链表尾部push一个元素");

// 从链表尾部pop出一个元素
echo "pop链表中的元素:" . $list->pop() . PHP_EOL;

// 在链表头部插入元素
$list->unshift("first");
// 在链表头部删除元素
$list->shift();

// 当前节点元素为null
echo "当前节点元素:" . $list->current() . PHP_EOL;
$list->rewind();    // 重置当前指针 重置到链表尾部
echo "重置后节点元素: " . $list->current() . PHP_EOL;

// 注意 pre next获取到的值 和 当前的linkList mode关联
$list->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO);
$list->prev();
echo "当前节点元素:" . $list->current() . PHP_EOL;
$list->next();
echo "当前节点元素:" . $list->current() . PHP_EOL;

Stack (堆栈)

Stack 是一种常见的数据结构。特点是只能在一端(称为栈顶top)对数据进行插入和删除。也就是我们常见的LIFO(Last In First Out)。spl中提供SplStack类实现堆栈。SplStack基于双向列表实现,继承自SplDoublyLinkedList类

$obj = new SplStack();
$obj->push(1);
$obj->push(\'two\');
$obj->push(3);

echo "pop: " . $obj->pop() . PHP_EOL;
echo "pop: " . $obj->pop() . PHP_EOL;
echo "pop: " . $obj->pop() . PHP_EOL;

// 继续pop会报错
//echo "pop: ".$obj->pop().PHP_EOL;

$obj->push(111);
$obj->push(\'222\');
$obj->push(333);

$obj->rewind();
while ($obj->valid()) {
    echo $obj->current(), "\\n";
    $obj->next();
}

Queue (队列)

Queue 应该是我们开发中使用最多的一种数据结构。我们所所熟知的消息队列往往就是基于队列实现。队列有时候也被称为线性表。最大的特点就是 先进先出 FIFO. spl中的SplQueue类就是实现队列这种数据结构。底层同样是基于双向列表实现。

$obj = new SplQueue();
$obj->enqueue(\'a\');
$obj->enqueue(\'b\');
$obj->enqueue(\'c\');

//出队
echo "出队:" . $obj->dequeue() . PHP_EOL;
echo "出队:" . $obj->dequeue() . PHP_EOL;
echo "出队:" . $obj->dequeue() . PHP_EOL;

// 当队列中存在元素在出队时会报错 RuntimeException:
//echo "出队:".$obj->dequeue().PHP_EOL;

下一篇: Heap,最大堆,最小堆

以上是关于SPL 数据结构1-双向链表,堆栈,队列的主要内容,如果未能解决你的问题,请参考以下文章

LinkList(双向链表实现)

PHP标准库(SPL)- SplDoublyLinkedList类(双向链表)

Java 自定义双向链表

LinkedList

LinkedList源码分析

Java集合四LinkedList