普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头取出。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先取出。优先队列具有最高级先出 (largest-in,first-out)的行为特征。

总结下来就是普通队列有先进先出原则,优先级队列有优先级高先出原则,这个优先级可以设置;

类摘要

// 1. 没有实现ArrayAccess接口,所以不能像数组那样操作;
SplPriorityQueue implements Iterator , Countable {
/* 方法 */
public __construct ( void ) // 比较方法,内部应该用到了冒泡排序,对于权重值来说,返回0代表相等,返回正整数就代表大于,返回负整数就代表小于;
// 默认是权重值越优先,也可以让其被子类覆盖改为权重值越小越优先
public int compare ( mixed $priority1 , mixed $priority2 )
public mixed extract ( void ) //恢复到上一个被破坏的节点? 测试无用;
public void recoverFromCorruption ( void )
public void setExtractFlags ( int $flags )
public void insert ( mixed $value , mixed $priority ) public int count ( void )
public mixed current ( void )
public bool isEmpty ( void )
public mixed key ( void )
public void next ( void )
public void rewind ( void )
public mixed top ( void )
public bool valid ( void )
}

Example

class PQtest extends SplPriorityQueue
{
//覆盖父类,更改其优先规则为权重值越小越优先;
public function compare($priority1, $priority2)
{
if ($priority1 === $priority2) return 0;
return $priority1 > $priority2 ? -1 : 1;
}
} $pq = new PQtest(); // 设置值与优先值
$pq->insert('a', 10);
$pq->insert('b', 1);
$pq->insert('c', 8); /**
* 设置元素出队模式
* SplPriorityQueue::EXTR_DATA 仅提取值
* SplPriorityQueue::EXTR_PRIORITY 仅提取优先级
* SplPriorityQueue::EXTR_BOTH 提取数组包含值和优先级
*/
$pq->setExtractFlags(PQtest::EXTR_BOTH); //从顶部取出一个节点,该节点下面的节点移上为顶部节点;
print_r(
$pq->extract()
);
/*
[data] => b
[priority] => 1
*/ $pq->recoverFromCorruption(); //拿出顶部节点
print_r(
$pq->extract()
); /*
[data] => c
[priority] => 8
*/ // 还原自上一个节点? 没什么效果?
$pq->recoverFromCorruption(); print_r(
$pq->current()
); $pq->rewind();
while($pq->valid()){
print_r($pq->current());
echo PHP_EOL;
$pq -> next();
}

【SPL标准库专题(6)】 Datastructures:SplPriorityQueue的更多相关文章

  1. 【SPL标准库专题(1)】 SPL简介

    什么是SPL SPL是Standard PHP Library(PHP标准库)的缩写. 根据官方定义,它是"a collection of interfaces and classes th ...

  2. 【SPL标准库专题(9)】 Datastructures:SplObjectStorage

    PHP SPL SplObjectStorage是用来存储一组对象的,特别是当你需要唯一标识对象的时候. PHP SPL SplObjectStorage类实现了Countable,Iterator, ...

  3. 【SPL标准库专题(8)】 Datastructures:SplFixedArray

    SplFixedArray主要是处理数组相关的主要功能,与普通php array不同的是,它是固定长度的,且以数字为键名的数组,优势就是比普通的数组处理更快. 类摘要 SplFixedArray im ...

  4. 【SPL标准库专题(7)】 Datastructures:SplHeap & SplMaxHeap & SplMinHeap

    堆(Heap)就是为了实现优先队列而设计的一种数据结构,它是通过构造二叉堆(二叉树的一种)实现.根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆.二叉堆还常用于排序(堆排序). 类摘 ...

  5. 【SPL标准库专题(5)】 Datastructures:SplStack & SplQueue

    这两个类都是继承自SplDoublyLinkedList,分别派生自SplDoublyLinkedList的堆栈模式和队列模式:所以放在一起来介绍: 堆栈SplStack # 类摘要 SplStack ...

  6. 【SPL标准库专题(4)】 Datastructures:SplDoublyLinkedList

    简述 双链表是一种重要的线性存储结构,对于双链表中的每个节点,不仅仅存储自己的信息,还要保存前驱和后继节点的地址. 类摘要 SplDoublyLinkedList implements Iterato ...

  7. 【SPL标准库专题(3)】 Classes

    我把SPL分为四个部分:Iterator,Classes,Datastructures,Function:而其中classes是就是做一些类的介绍(Iterator与Datastructures相关的 ...

  8. 【SPL标准库专题(10)】SPL Exceptions

    嵌套异常 了解SPL异常之前,我们先了解一下嵌套异常.嵌套异常顾名思义就是异常里面再嵌套异常,一个异常抛出,在catch到以后再抛出异常,这时可以通过Exception基类的getPrevious方法 ...

  9. 【SPL标准库专题(2)】 Iterator

    Iterator界面 本段内容来自阮一峰老师再加自己的部分注解 SPL规定,所有部署了Iterator界面的class,都可以用在foreach Loop中.Iterator界面中包含5个必须部署的方 ...

随机推荐

  1. 高可用Hadoop平台-启航

    1.概述 在上篇博客中,我们搭建了<配置高可用Hadoop平台>,接下来我们就可以驾着Hadoop这艘巨轮在大数据的海洋中遨游了.工欲善其事,必先利其器.是的,没错:我们开发需要有开发工具 ...

  2. Mac OS X 下搭建thrift环境

    1.概述 thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生产引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, ...

  3. es简单介绍及使用注意事项

    是什么? Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎.无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进.性能最好的.功能最全的搜索引擎库. El ...

  4. [转]Microsoft SQL SERVER 2008 R2 REPORT SERVICE 匿名登录

    本文转自:https://www.cnblogs.com/Zouzhe/p/5736070.html SQL SERVER 2008 R2 是微软目前最新的数据库版本,在之前的SQL SERVER 2 ...

  5. 查询Sql Server数据库对象结构

    查询Sql Server数据库对象结构 查询数据库 查询架构 查询表 查询列 查询存储过程 查询视图 1.查询某一服务器下所有数据库 select t.[name] as 数据库 from sys.d ...

  6. 使用Docker调试Asp.Net Core

    使用 Docker 进行部署 目前还是使用将发布出来的文件打包进docker镜像的形式 $ docker build -t pims . $ docker run --name pims --rm - ...

  7. 关于web开发中,图片加载失败替换为默认图片

    页面上有用户自定义图片的时候经常会出现用户定义的图片特别是站外图片被删除或无法访问,因此,需要判断图片是否能成功被加载,否则自动换成“无法找到图片”之类的系统图片. document.body.onl ...

  8. [日常] go语言圣经-声明,变量,赋值,类型,包和文件习题

    go语言圣经-声明1.四种类型的声明语句:var.const.type和func,分别对应变量.常量.类型和函数实体对象的声明2.包一级声明语句声明的名字可在整个包对应的每个源文件中访问,局部声明的名 ...

  9. tomcat学习步骤,附带打破双亲委派模型企业应用实战

    1. tomcat入门 入门模块仅做学习大纲梳理,忽略了具体操作指引. Tomcat的三种部署模式: 简单架构模型 连接器的非阻塞模式(NIO) 通道(Channel).缓冲区(Buffer).选择器 ...

  10. Java JDBC SqlServer

    一.驱动 下载地址:https://www.microsoft.com/en-us/download/details.aspx?id=11774 引用Jar包时注意区分Java版本: Sqljdbc4 ...