优先队列是队列的一种,不过它可以按照自定义的一种方式(数据的优先级)来对队列中的数据进行动态的排序。

  每次的push和pop操作,队列都会动态的调整,以达到我们预期的方式来存储。例如:我们常用的操作就是对数据排序,优先队列默认的是数据大的优先级高。所以我们无论按照什么顺序push一堆数,最终在队列里总是top出最大的元素。

  使用优先队列需要包含STL头文件<queue>。

  

  1. 以一个例子来解释吧:
  2. view plaincopy to clipboardprint?
  3. /*优先队列的基本使用 2010/7/24 dooder*/
  4. #include<stdio.h>
  5. #include<functional>
  6. #include<queue>
  7. #include<vector>
  8. using namespace std;
  9. //定义结构,使用运算符重载,自定义优先级1
  10. struct cmp1{
  11. bool operator ()(int &a,int &b){
  12. return a>b;//最小值优先
  13. }
  14. };
  15. struct cmp2{
  16. bool operator ()(int &a,int &b){
  17. return a<b;//最大值优先
  18. }
  19. };
  20. //定义结构,使用运算符重载,自定义优先级2
  21. struct number1{
  22. int x;
  23. bool operator < (const number1 &a) const {
  24. return x>a.x;//最小值优先
  25. }
  26. };
  27. struct number2{
  28. int x;
  29. bool operator < (const number2 &a) const {
  30. return x<a.x;//最大值优先
  31. }
  32. };
  33. int a[]={14,10,56,7,83,22,36,91,3,47,72,0};
  34. number1 num1[]={14,10,56,7,83,22,36,91,3,47,72,0};
  35. number2 num2[]={14,10,56,7,83,22,36,91,3,47,72,0};
  36.  
  37. int main()
  38. { priority_queue<int>que;//采用默认优先级构造队列
  39.  
  40. priority_queue<int,vector<int>,cmp1>que1;//最小值优先
  41. priority_queue<int,vector<int>,cmp2>que2;//最大值优先
  42.  
  43. priority_queue<int,vector<int>,greater<int> >que3;//注意“>>”会被认为错误,
  44. //这是右移运算符,所以这里用空格号隔开
  45. priority_queue<int,vector<int>,less<int> >que4;////最大值优先
  46.  
  47. priority_queue<number1>que5;
  48. priority_queue<number2>que6;
  49.  
  50. int i;
  51. for(i=0;a[i];i++){
  52. que.push(a[i]);
  53. que1.push(a[i]);
  54. que2.push(a[i]);
  55. que3.push(a[i]);
  56. que4.push(a[i]);
  57. }
  58. for(i=0;num1[i].x;i++)
  59. que5.push(num1[i]);
  60. for(i=0;num2[i].x;i++)
  61. que6.push(num2[i]);
  62.  
  63. printf("采用默认优先关系:\n(priority_queue<int>que;)\n");
  64. printf("Queue 0:\n");
  65. while(!que.empty()){
  66. printf("%3d",que.top());
  67. que.pop();
  68. }
  69. puts("");
  70. puts("");
  71.  
  72. printf("采用结构体自定义优先级方式一:\n(priority_queue<int,vector<int>,cmp>que;)\n");
  73. printf("Queue 1:\n");
  74. while(!que1.empty()){
  75. printf("%3d",que1.top());
  76. que1.pop();
  77. }
  78. puts("");
  79. printf("Queue 2:\n");
  80. while(!que2.empty()){
  81. printf("%3d",que2.top());
  82. que2.pop();
  83. }
  84. puts("");
  85. puts("");
  86. printf("采用头文件\"functional\"内定义优先级:\n(priority_queue<int,vector<int>,greater<int>/less<int> >que;)\n");
  87. printf("Queue 3:\n");
  88. while(!que3.empty()){
  89. printf("%3d",que3.top());
  90. que3.pop();
  91. }
  92. puts("");
  93. printf("Queue 4:\n");
  94. while(!que4.empty()){
  95. printf("%3d",que4.top());
  96. que4.pop();
  97. }
  98. puts("");
  99. puts("");
  100. printf("采用结构体自定义优先级方式二:\n(priority_queue<number>que)\n");
  101. printf("Queue 5:\n");
  102. while(!que5.empty()){
  103. printf("%3d",que5.top());
  104. que5.pop();
  105. }
  106. puts("");
  107. printf("Queue 6:\n");
  108. while(!que6.empty()){
  109. printf("%3d",que6.top());
  110. que6.pop();
  111. }
  112. puts("");
  113. return 0;
  114. }
  115. /*
  116. 运行结果 :
  117. 采用默认优先关系:
  118. (priority_queue<int>que;)
  119. Queue 0:
  120. 91 83 72 56 47 36 22 14 10 7 3
  121.  
  122. 采用结构体自定义优先级方式一:
  123. (priority_queue<int,vector<int>,cmp>que;)
  124. Queue 1:
  125. 3 7 10 14 22 36 47 56 72 83 91
  126. Queue 2:
  127. 91 83 72 56 47 36 22 14 10 7 3
  128.  
  129. 采用头文件"functional"内定义优先级:
  130. (priority_queue<int,vector<int>,greater<int>/less<int> >que;)
  131. Queue 3:
  132. 3 7 10 14 22 36 47 56 72 83 91
  133. Queue 4:
  134. 91 83 72 56 47 36 22 14 10 7 3
  135.  
  136. 采用结构体自定义优先级方式二:
  137. (priority_queue<number>que)
  138. Queue 5:
  139. 3 7 10 14 22 36 47 56 72 83 91
  140. Queue 6:
  141. 91 83 72 56 47 36 22 14 10 7 3
  142. */
  143. 运行结果:
  144. 采用默认优先关系:
  145. (priority_queue<int>que;)
  146. Queue 0:
  147. 91 83 72 56 47 36 22 14 10 7 3
  148. 采用结构体自定义优先级方式一:
  149. (priority_queue<int,vector<int>,cmp>que;)
  150. Queue 1:
  151. 3 7 10 14 22 36 47 56 72 83 91
  152. Queue 2:
  153. 91 83 72 56 47 36 22 14 10 7 3
  154. 采用头文件"functional"内定义优先级:
  155. (priority_queue<int,vector<int>,greater<int>/less<int> >que;)
  156. Queue 3:
  157. 3 7 10 14 22 36 47 56 72 83 91
  158. Queue 4:
  159. 91 83 72 56 47 36 22 14 10 7 3
  160. 采用结构体自定义优先级方式二:
  161. (priority_queue<number>que)
  162. Queue 5:
  163. 3 7 10 14 22 36 47 56 72 83 91
  164. Queue 6:
  165. 91 83 72 56 47 36 22 14 10 7 3
  166.  
  167. 优先队列的默认优先级是按照从小到大的顺序排列的。
    优先队列在解决很多问题的时候很方便,最常用的一个是用来对数组进行排序,这个就不讲了,除此之外,比较常见的一个用法是可以用来做哈夫曼数。
    比如一道这样的题:
  1. 题意:给出一行字符串,求出其原编码需要的编码长度和哈夫曼编码所需的长度,并求其比值
  2. 分析:根据哈夫曼生成树的生成过程可知,其生成树的权值是固定的而且这个值是最小的,而且其值根据生成树的顺序,我们可以找出规律而
  3. 不需要真的去生成一棵树然后再求出权值,其模拟过程为取出队列中权值最小的两个元素,将其值加入结果中,然后将这两个元素的权值求和
  4. 即得出其父节点的权值,将生成元素作为结点入队~~如此循环,直至取出队列中最后两个元素加入结果,实现代码如下:
  5. view plaincopy to clipboardprint?
  6. /*HDU 1053 采用广搜求哈夫曼生成树的权值 0ms dooder*/
  7. #include<stdio.h>
  8. #include<string.h>
  9. #include<ctype.h>
  10. #include<functional>
  11. #include<queue>
  12. using namespace std;
  13. #define M 1000050
  14. char str[M];
  15. int list[27];
  16.  
  17. priority_queue< int,vector<int>,greater<int> >que;
  18.  
  19. int main()
  20. {
  21. int ans,sum;
  22. int i,a,b,c;
  23. while(scanf("%s",str),strcmp(str,"END")){
  24. memset(list,0,sizeof(list));
  25. for(i=0;str[i];i++){
  26. if(isalpha(str[i]))
  27. list[str[i]-'A']++;
  28. else
  29. list[26]++;
  30. }
  31. sum=i*8;ans=i;c=0;
  32. for(i=0;i<27;i++){
  33. if(list[i]){
  34. que.push(list[i]);
  35. c++;
  36. }
  37. }
  38. if(c>1){ans=0;//注意只有一种字符的情况
  39. while(que.size()!=1){
  40. a=que.top();
  41. que.pop();
  42. b=que.top();
  43. que.pop();
  44. ans+=a+b;         //核心代码
  45. que.push(a+b);
  46. }
  47. while(!que.empty())//使用后清空队列
  48. que.pop();
  49. }
  50. printf("%d %d %.1f\n",sum,ans,1.0*sum/ans);
  51. }
  52. return 0;
  53. }
  1. 其次,还有以下几种用途:

  1.一些任务调度算法

比如操作系统的线程的调度算法,有的是按照优先级来调度的,每次都执行优先级较高的线程

2.合并n个文件为1个有序文件

首先把n个有序文件的第一个元素取出来,放到优先队列里面,然后取最小值,然后再插入元素导优先队列,取最小值。

3、由于优先队列内部是由堆实现的,所以适用于堆的都适用于优先队列

比如排序,找中位数,找最大的k个数

  1.  

优先队列priority_queue的使用的更多相关文章

  1. 浅谈C++ STL中的优先队列(priority_queue)

    从我以前的博文能看出来,我是一个队列爱好者,很多并不是一定需要用队列实现的算法我也会采用队列实现,主要是由于队列和人的直觉思维的一致性导致的. 今天讲一讲优先队列(priority_queue),实际 ...

  2. 优先队列priority_queue的简单应用

    优先队列 引入 优先队列是一种特殊以及强大的队列. 那么优先队列是什么呢? 说白了,就是一种功能强大的队列. 它的功能强大在哪里呢? 四个字:自动排序. 优先队列的头文件&&声明 头文 ...

  3. 9.优先队列,priority_queue

    #include <iostream> #include <queue> #include <deque> #include <list> using ...

  4. 892A. Greed#贪婪(优先队列priority_queue)

    题目出处:http://codeforces.com/problemset/problem/892/A 题目大意:有一些可乐(不一定装满),问能不能把所有可乐装进两个可乐瓶中 #include< ...

  5. 【STL】优先队列priority_queue详解+OpenJudge-4980拯救行动

    一.关于优先队列 队列(queue)这种东西广大OIer应该都不陌生,或者说,队列都不会你还学个卵啊(╯‵□′)╯︵┻━┻咳咳,通俗讲,队列是一种只允许从前端(队头)删除元素.从后端(队尾)插入元素的 ...

  6. 优先队列priority_queue的比较函数

    STL头文件:#include<queue> 优先队列: 默认从大到小排列:priority_queuee<node>q; 自定义优先级的三种方法: 1.重载操作符: bool ...

  7. [转]c++优先队列(priority_queue)用法详解

    既然是队列那么先要包含头文件#include <queue>, 他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队 优先队列具有队列的所有特性, ...

  8. STL队列 之FIFO队列(queue)、优先队列(priority_queue)、双端队列(deque)

    1.FIFO队列   std::queue就是普通意思上的FIFO队列在STL中的模版. 1.1主要的方法有: (1)T front():访问队列的对头元素,并不删除对头元素 (2)T back(): ...

  9. C++ STL 优先队列 priority_queue 详解(转)

    转自https://blog.csdn.net/c20182030/article/details/70757660,感谢大佬. 优先队列 引入 优先队列是一种特殊的队列,在学习堆排序的时候就有所了解 ...

  10. 优先队列priority_queue

    优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素.但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队.这点类似于给队列 ...

随机推荐

  1. CentOS7 中使用 firewall-cmd 控制端口和端口转发

    0X00 firewalld 守护进程 firewall-cmd命令需要firewalld进程处于运行状态.我们可以使用systemctl status/start/stop/restart fire ...

  2. CF-1114 (2019/02/11)

    CF-1114 A. Got Any Grapes? skip B. Yet Another Array Partitioning Task 将n个数分成连续的k组,使得每组的前m大的数字的总和最大. ...

  3. 转 Spring源码剖析——核心IOC容器原理

    Spring源码剖析——核心IOC容器原理 2016年08月05日 15:06:16 阅读数:8312 标签: spring源码ioc编程bean 更多 个人分类: Java https://blog ...

  4. SEO 优化

    1.什么是SEO优化: 简单的来说就是了解搜索引擎的排名规则,投机所好,让我们的网站在搜索引擎上得到靠前的排名,获取更多流量的一种方式. 2.SEO优化-衡量标准 关键词的排名--核心关键词的效果 收 ...

  5. Applied Nonparametric Statistics-lec7

    Ref: https://onlinecourses.science.psu.edu/stat464/print/book/export/html/9 经过前面的步骤,我们已经可以判断几个样本之间是否 ...

  6. LeetCode(219) Contains Duplicate II

    题目 Given an array of integers and an integer k, find out whether there are two distinct indices i an ...

  7. freertos知识点笔记——队列、二值信号量、计数信号量

    队列1.队列queue通常用于任务之间的通信,一个任务写缓存,另一个任务读缓存.队列还会有等待时间,2.阻塞超时时间.如果在发送时队列已满,这个时间即是任务处于阻塞态等待队列空间有效的最长等待时间.如 ...

  8. CodeForces - 948C Producing Snow(优先队列)

    题意: n天. 每天你会堆一堆雪,体积为 v[i].每天都有一个温度 t[i] 所有之前堆过的雪在第 i 天体积都会减少 t[i] . 输出每天融化了的雪的体积. 这个题的正解我怎么想都很难理解,但是 ...

  9. 【转】MySQL innodb_autoinc_lock_mode 详解 ,并发插入时主键冲突的解决方案

    本文转载于 http://www.cnblogs.com/JiangLe/p/6362770.html innodb_autoinc_lock_mode这个参数控制着在向有auto_increment ...

  10. CSS 工程化 小结

    CSS 工程化 组成:1.组织 (代码目录)2.优化(那种实现方式更好) 3.构建(代码完成后需要经过哪些处理步骤) 4.维护 常见问题 1.如何解决 CSS 模块化问题 1.Less Sass 等C ...