php堆栈、队列、优先级队列

2021-03-23

PHP7高效的数据结构,可以作为array的替代

安装

扩展地址:https://pecl.php.net/package/ds
Composer安装地址:https://packagist.org/packages/php-ds/php-ds

使用composer安装可以不用开启扩展

Stack类(堆栈)

堆栈是“后进先出”或“LIFO”的集合,该集合仅允许访问结构顶部的值,并以破坏性的顺序按此顺序进行迭代。

创建堆栈

// 创建堆栈,初始值为$values,类型不限
$stack = new Ds\Stack($values);

// 复制堆栈的浅副本,更新副本不会影响原始版本
$stack->copy();

入栈\出栈

// 向堆栈顶部插入一个或多个数据$values
$stack->push(...$values);

// 获取堆栈顶部的值并删除
$stack->pop();

// 获取堆栈顶部的值但不删除
$queue->peek();

// 清空堆栈
$stack->clear();

// 判断堆栈是否为空
$stack->isEmpty();

统计堆栈数量

// 获取堆栈的值的数量
$stack->count();

转换堆栈

// 堆栈数据转换为数组,数据顺序相同
$stack->toArray();

// 堆栈数据转换为json,数据顺序相同
$stack->jsonSerialize();

堆栈内存

// 为堆栈所需的容量分配内存
// $capacity应当为其分配容量的值的数量如果此值小于或等于当前容量,容量将保持不变;容量将始终四舍五入到最接近的2的幂
$stack->allocate($capacity);

// 获取堆栈的内存
$stack->capacity();

Queue类(队列)

队列是“先进先出”或“ FIFO”集合,它仅允许访问队列前面的值并以破坏性的顺序按此顺序进行迭代

创建队列

// 创建队列,初始值为$values,类型不限
$queue = new Ds\Queue($values);

// 复制队列的浅副本,更新副本不会影响原始版本
$queue->copy();

入队列\出队列

// 向队列尾部插入一个或多个数据$values
$queue->push(...$values);

// 获取队列顶部的值并删除
$queue->pop();

// 获取队列顶部的值但不删除
$queue->peek();

// 清空队列
$queue->clear();

// 判断队列是否为空
$queue->isEmpty();

统计队列数量

// 获取队列的值的数量
$queue->count();

转换队列

// 队列数据转换为数组,数据顺序相同
$queue->toArray();

// 队列数据转换为json,数据顺序相同
$queue->jsonSerialize();

队列内存

// 为队列所需的容量分配内存
// $capacity应当为其分配容量的值的数量如果此值小于或等于当前容量,容量将保持不变;容量将始终四舍五入到最接近的2的幂
$queue->allocate($capacity);

// 获取队列的内存
$queue->capacity();

PriorityQueue类(优先级队列)

与Queue非常相似。值将以指定的优先级推送到队列中,而优先级最高的值将始终位于队列的最前面。使用最大堆实现。
对于具有相同优先级的值,将保留“先进先出”顺序。在PriorityQueue上进行迭代是破坏性的,等效于连续的弹出操作,直到队列为空

创建队列

// 创建队列,初始值为$values,类型不限
$queue= new Ds\PriorityQueue($values);

// 复制队列的浅副本,更新副本不会影响原始版本
$queue->copy();

入队列\出队列

// 向队列插入一个数据$values,优先级为$priority
$queue->push($values, $priority);

// 获取队列顶部的值并删除
$queue->pop();

// 获取队列顶部的值但不删除
$queue->peek();

// 清空队列
$queue->clear();

// 判断队列是否为空
$queue->isEmpty();

统计队列数量

// 获取队列的值的数量
$queue->count();

转换队列

// 队列数据转换为数组,数据顺序相同
$queue->toArray();

// 队列数据转换为json,数据顺序相同
$queue->jsonSerialize();

队列内存

// 为队列所需的容量分配内存,
// $capacity应当为其分配容量的值的数量如果此值小于或等于当前容量,容量将保持不变;容量将始终四舍五入到最接近的2的幂
$queue->allocate($capacity);

// 获取队列的内存
$queue->capacity();
{/if}