队列
//SqlQueue队列 文档:https://www.php.net/manual/zh/class.splqueue.php
$queue = new SplQueue();
//入队
$queue->push($data);
$queue->enqueue($data);
//出队
$queue->shift();
$queue->dequeue();
//队尾出列
$queue->pop();
//队头插入
$queue->unshift($data);
//查询队列中的排队数量
$n = count($queue);
栈
//SqlStack 栈
$stack = new SplStack();
//入栈
$stack->push($data);$queue->unshift($data);
//出栈
$stack->pop();
//栈顶元素
$stack->top();
//栈底元素
$stack->bottom();
//数量
$stack->count();
/*
$stack->offsetSet(0,'C'); //堆栈的节点0是top 的节点,设置节点的值
$stack->rewind(); //双向链表的rewind和堆栈的rewind相反,堆栈的rewind使得当前指针指向TOP所在的位置,而双向链表调用之后指向bottom所在的位置
echo "qq".$stack->next(); // 堆栈的next与双向链表相反
echo "re".$stack->current()."</br>";
//echo "bo".$stack->bottom()."</br>";
//echo "top".$stack->top();
print_r($stack);
*/
//从TOP开始遍历
$stack->rewind();
while($stack->valid()){
echo $stack->key()."=>".$stack->current()."</br>";
$stack->next();
}
$pop = $stack->pop();
echo $pop;
双向链表
$obj = new SplDoublyLinkedList();
$obj->push(1);
$obj->push(2);
$obj->push(3);
$obj->unshift(10); //unshifit 替换双向链表的首部
$obj->rewind(); // 使用current 必须调用rewind,把节点指针指向bottom节点
$obj->next(); // next 指向下一个节点
$obj->prev(); // 指针指向上一个节点
echo $obj->current(); // 指针指向当前结点
if($obj->current())
{
echo "y";
}else{
echo "n";
}
if($obj->valid()){
//如果当前节点是有效节点 valid则返回true
}
$obj->pop();
//var_dump($obj);
print_r($obj);
堆:SplHeap
abstract SplHeap implements Iterator , Countable {
/* 方法 */
public __construct()
abstract protected compare(mixed $value1, mixed $value2): int
public count(): int
public current(): mixed
public extract(): mixed
public insert(mixed $value): void
public isCorrupted(): bool
public isEmpty(): bool
public key(): mixed
public next(): void
public recoverFromCorruption(): void
public rewind(): void
public top(): mixed
public valid(): bool
}
$heap = new SplMinHeap();//最大堆SplMaxHeap
$heap->insert(22);
$heap->insert(2);
$heap->insert(222);
foreach( $heap as $number ) {
echo $number;
}
优先级队列:【默认是最大堆】
堆特效:
这里需要注意并理解:SplPriorityQueue是以堆数据结构来实现的,当我们出队时会拿出堆顶的元素,此时堆的特性被破坏,堆会进行相应的调整至稳定态(MaxHeap or MinHeap),即会将最后一个元素替换到堆顶,然后进行稳定态验证,不符合堆特性则继续调整,或者我们就得到了一个稳定态的堆,所以当优先级相同,出队顺序并不会按照入队顺序。
文档:https://www.php.net/manual/zh/class.splpriorityqueue.php
$splPriorityQueue = new \SplPriorityQueue();
// 设定返回数据的meta信息
// \SplPriorityQueue::EXTR_DATA 默认 只返回数
// \SplPriorityQueue::EXTR_PRIORITY 只返回优先级
// \SplPriorityQueue::EXTR_BOTH 返回数据和优先级
// $splPriorityQueue->setExtractFlags(\SplPriorityQueue::EXTR_DATA);
$splPriorityQueue->insert("task1", 1);
$splPriorityQueue->insert("task2", 1);
$splPriorityQueue->insert("task3", 1);
$splPriorityQueue->insert("task4", 1);
$splPriorityQueue->insert("task5", 1);
echo $splPriorityQueue->extract() . PHP_EOL;
echo $splPriorityQueue->extract() . PHP_EOL;
echo $splPriorityQueue->extract() . PHP_EOL;
echo $splPriorityQueue->extract() . PHP_EOL;
echo $splPriorityQueue->extract() . PHP_EOL;
//执行结果
task1
task5
task4
task3
task2
SplFixedArray 定长数组
提供了数组的主要功能,和普通数组相比主要区别在于 SplFixedArray 需要手动调节大小,并且只允许范围内的整数作为索引。其优点是它使用的内存比标准数组少。
$array = new SplFixedArray(5);
$array[1] = 2;
$array[4] = "foo";
var_dump($array[0]); // NULL
var_dump($array[1]); // int(2)
var_dump($array["4"]); // string(3) "foo"
// Increase the size of the array to 10
$array->setSize(10);