关于php使用栈和队列

队列

//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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值