SPL
普通队列
先入先出(FIFO)
$queue = new SplQueue;
// 入队
$queue->enqueue(1); // 此时队列中的节点为 1
$queue->enqueue(2); // 此时队列中的节点为 2 - 1
$queue->enqueue(3); // 此时队列中的节点为 3 - 2 - 1
// 队列节点的个数
$size = $queue->count();
// 得到最后入列元素的值
$top = $queue->top(); // 此时结果为3,队列节点不变
// 得到先入列元素的值
$bottom = $queue->bottom(); // 此时结果为1,队列节点不变
// 出队
$queue->dequeue(); // 此时队列中的节点为 3 - 2
$queue->dequeue(); // 此时队列中的节点为 3
$queue->dequeue(); // 此时队列中的节点为 空
// 判断队列是否为空
$result = $queue->isEmpty(); // 结果为true
先入后出(FILO)
$queue = new SplQueue;
// 入队
$queue->push(1); // 此时队列中的节点为 1
$queue->push(2); // 此时队列中的节点为 2 - 1
$queue->push(3); // 此时队列中的节点为 3 - 2 - 1
// 出列
$queue->pop(); // 次数队列中的节点为 2 - 1
$queue->pop(); // 次数队列中的节点为 1
$queue->pop(); // 次数队列中的节点为 空
// 入列
$queue->enqueue(1); // 此时队列中的节点为 1
$queue->enqueue(2); // 此时队列中的节点为 2 - 1
$queue->enqueue(3); // 此时队列中的节点为 3 - 2 - 1
// 出列
$queue->dequeue(); // 此时队列中的节点为 3 - 2
$queue->dequeue(); // 此时队列中的节点为 3
$queue->dequeue(); // 此时队列中的节点为 空
迭代器指针
$queue = new SplQueue;
// 将元素压入队列
$queue->enqueue(1); // 此时队列中的节点为 1
$queue->enqueue(2); // 此时队列中的节点为 2 - 1
$queue->enqueue(3); // 此时队列中的节点为 3 - 2 - 1
// 将迭代器指针退回到第一个节点(按入列顺序)
$queue->rewind();
// 得到当前节点的值,如果直接使用,得到的结果是NULL,必须在rewind之后使用
$current = $queue->current();
// 当前节点的序号(按入列顺序,从0开始)
$queue->key();
// 当前迭代器指向的节点是否为空
$valid = $queue->valid();
// 迭代器指向下一个节点(按入列顺序)
$queue->next();
优先级队列
PHP: SplPriorityQueue - Manual
| 概念 | 描述 |
|---|---|
| 定义 | PHP SPL 提供的基于堆 (Heap) 的数据结构,用于存储带优先级的元素。 |
| 核心特性 | 最大堆 (Max Heap):总是先提取优先级最高(数字最大)的元素。 |
| 关键方法 | insert(data, priority) |
extract() |
|
isEmpty() |
|
count() |
|
| 提取模式 | setExtractFlags() |
| 稳定性 | 非稳定:如果两个元素的优先级相同,它们出队的顺序是不确定的(通常是后插入的先出)。 |
| Min Heap 实现 | 如果需要最小堆(优先级数字最小的先出),可以在插入时将优先级取负值 (-priority)。 |
// 创建并设置提取模式:只返回数据
$queue = new SplPriorityQueue();
$queue->setExtractFlagsEXTR_DATA;
// 插入任务(数据, 优先级)
$queue->insert('Task A (P100)', 100);
$queue->insert('Task B (P10)', 10);
$queue->insert('Task C (P80)', 80);
$queue->insert('Task D (P5)', 5);
$queue->insert('Task E (P100)', 100);
echo "任务处理顺序 (高优先级优先):\n";
// 循环提取并处理任务
while (!$queue->isEmpty()) {
echo $queue->extract() . "\n";
}
/*
任务处理顺序 (高优先级优先):
Task A (P100)
Task E (P100)
Task C (P80)
Task B (P10)
Task D (P5)
*/