queue-概述:

队列是一种特殊的线性表,它只允许在表的前端(Front)进行删除操作,而在表的后端(Rear)进行插入操作。
l进行插入操作的端称为队尾,进行删除操作的端称为队头。
队列中没有元素时,称为空队列。
在队列这种数据结构中,最先插入在元素将是最先被删除;反之最后插入的元素将最后被删除,因此队列又称为“先进先出”(FIFO—First In First Out)的线性表。

bool empty()

队列为空返回true,否则返回false

void   pop()

删除队列的一个元素

void push( const   TYPE &val   )

将val元素加入队列

size_type   size()

返当前队列中的元素数目

TYPE &back()

返回一个引用,指向队列的最后一个元素

TYPE   &front()

返回队列第一个元素的引用

题目练习:
(会陆续添加)
priority_queue-概述:
优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素。但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队。
元素的比较规则默认按元素值由大到小排序,可以重载“<”操作符来重新定义比较规则。

bool empty()

优先队列为空返回true,否则返回false

void   pop()

删除优先队列中的第一个元素

void   push( const   TYPE &val   )

添加一个元素到优先队列中,值为val

size_type   size()

返当前队列中的元素数目

TYPE   &top ()

返回一个引用,指向最高优先级的元素

题目练习:
(会陆续添加)
1.一道并不简单的综合性题目。(小声告诉你, 读入时考考虑递归)。 set + priority_queue 很虐心哦!
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1097

 1 #include<iostream>
 2 #include<queue>
 3 #include<set>
 4 #include<vector>
 5 using namespace std;
 6
 7 void parse(vector<set<int> >&adj, unsigned int p=0)//十分巧妙地递归读入。
 8 {
 9     unsigned int x;
10     cin>>x;
11     if(p)
12     {
13         adj[p].insert(x);
14         adj[x].insert(p);
15     }
16     while(true)
17     {
18         char ch;
19         cin>>ch;
20         if(ch==')') break;
21         parse(adj, x);
22     }
23     return;
24 }
25
26 int main()
27 {
28     //freopen( "in.txt", "r", stdin );
29     //freopen( "out.txt", "w", stdout );
30     char ch;
31     while(cin>>ch)
32     {
33         vector<set<int> > adj(1024, set<int>());
34         parse(adj);
35         priority_queue<int, vector<int>, greater<int> >leafs;
36         int n = 0;
37         for(unsigned int i = 0; i<adj.size();i++)
38         if(adj[i].size())
39         {
40             n++;
41             if(adj[i].size()==1)
42             leafs.push(i);
43         }
44         for(int k=1; k<n; k++)
45         {
46             unsigned int x = leafs.top();
47             leafs.pop();
48             unsigned int p = *(adj[x].begin());
49             if(k>1)
50             cout<<" ";
51             cout<<p;
52             adj[p].erase(x);
53             if(adj[p].size()==1)
54             leafs.push(p);
55         }
56         cout<<endl;
57     }
58     return 0;
59 }

View Code

2.求第K大的数。
http://acm.hdu.edu.cn/showproblem.php?pid=4006

#include<algorithm>
#include<vector>
#include<queue>
#include<cstdio>
#include<iostream>
using namespace std;int main()
{int n, k;while(~scanf("%d%d", &n, &k)){priority_queue<int, vector<int>, greater<int> >que;while(n--){char op[5];scanf("%s", op);if(op[0]=='I'){int val;scanf("%d", &val);que.push(val);while(que.size()>k) que.pop();}else printf("%d\n", que.top());}}return 0;
}

View Code

(提醒:不要直接交代码, 上面代码不能通过杭电的编译器)。
然后稍加改变, 编写自己的比较函数,而不是用自带的算子(greater)。 结果就过啦! 也是十分的蛋疼,十分的无语!!!。

#include<algorithm>
#include<vector>
#include<queue>
#include<cstdio>
#include<iostream>
using namespace std;struct Cmp{bool operator()(const int&t1, const int&t2){return t1>t2;}};int main()
{int n, k;while(~scanf("%d%d", &n, &k)){priority_queue<int, vector<int>,Cmp>que;while(n--){char op[5];scanf("%s", op);if(op[0]=='I'){int val;scanf("%d", &val);que.push(val);while(que.size()>k) que.pop();}else printf("%d\n", que.top());}}return 0;
}

View Code

上面这个代码也不太好, 因为它有了太多的进队和出队, 每一次的进出都是需要维护优先队列的, 所以可以在入队满K个后, 在后来的插入时, 可以先比较一下, 然后决定是否插入。

#include<algorithm>
#include<vector>
#include<queue>
#include<cstdio>
#include<iostream>
using namespace std;struct Cmp{bool operator()(const int&t1, const int&t2){return t1>t2;}};int main()
{int n, k;while(~scanf("%d%d", &n, &k)){priority_queue<int, vector<int>,Cmp>que;int t = k;char op[5];int val;while(t--){scanf("%s", &op);scanf("%d", &val);que.push(val);}n = n-k;while(n--){scanf("%s", &op);if(op[0]=='I'){scanf("%d", &val);if(val>que.top())que.push(val), que.pop();}else printf("%d\n", que.top());}}return 0;
}

View Code

一般优先队列的定义方法:

priority_queue< Type,vector<Type>,greater<Type> >(小顶堆)

priority_queue< Type,vector<Type>,less<Type> >(大顶堆)

如果是自定义的结构体类型

priority_queue<Node,vector<Node>,cmp>

需要自己自定义结构体类型:

struct cmp

{

bool operator()(const Node &t1,const Node &t2)

{

return t1.b<t2.b;//相当于less,大顶堆

}

};

3.又是一道可以用优先队列解的题。 优先队列的功能还真强大。

http://acm.hdu.edu.cn/showproblem.php?pid=4393

#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;struct Node{int F;int index;friend bool operator<(Node a, Node b){if(a.F!=b.F) return a.F<b.F;else return a.index>b.index;}
};priority_queue<Node>q[110];
int main()
{int T;int kase, n, S;Node a;scanf("%d", &T);for(kase=1; kase<=T; kase++){scanf("%d", &n);for(int i=1; i<=n; i++){scanf("%d%d", &a.F, &S);a.index = i;q[S].push(a);}printf("Case #%d:\n", kase);for(int i=0; i<n; i++){int fast = -1, id = 1;for(int j=1; j<=100; j++)if(!q[j].empty()){Node tmp=q[j].top();if(tmp.F+i*j>fast) fast=tmp.F+i*j, id=j;else if(tmp.F+i*j==fast&&tmp.index<q[id].top().index) id = j;}printf("%d", q[id].top().index);q[id].pop();if(i<n-1)printf(" ");else printf("\n");}}return 0;
}

View Code

转载于:https://www.cnblogs.com/acm1314/p/4540627.html

STL--queue相关推荐

  1. stl:queue 源码_C ++ STL中的queue :: empty()和queue :: size()

    stl:queue 源码 In C++ STL, Queue is a type of container that follows FIFO (First-in-First-out) element ...

  2. STL—queue(队列) 详解

    首先,在STL中 queue 和 stack 其实并不叫容器(container),而是叫适配器(adapter),他们是对容器的再封装. 队列queue: 队列,简称对,是一种操作受限的线性表.限制 ...

  3. STL——queue、priority_queue、deque

    文章目录 queue(队列) priority_queue(优先队列) 1.与queue的区别: 2.示例: 3.priority_queue内元素优先级设置 deque 示例: queue(队列) ...

  4. STL queue priority_queue

    queue 队列 queue 队列 就像排队一样,后来的排在后面,先来的先出队.所以只能对队首和队尾的元素进行操作 back() 返回最后一个元素 empty() 如果队列空则返回真 front() ...

  5. STL - queue(队列)

    Queue简单介绍 queue是队列容器.是一种"先进先出"的容器. queue是简单地装饰deque容器而成为另外的一种容器. #include <queue> qu ...

  6. STL queue:男孩被绑架了!

    题目描述 男孩被绑架了! 他非常想念他的母亲,现在非常害怕.你想象不出他被关在的房间有多黑,这么穷吗?. 作为一个聪明的ACboy,你想把ACboy从怪物的迷宫里救出来,但是当你来到迷宫的门口时,怪物 ...

  7. [C++STL]queue容器用法介绍

  8. Queue+Stack(C++,标准库中的队列和栈)

    STL Queue(先进先出) 头文件#include 成员函数 queue::pop () //出队列 queue::push () //入队列 queue::size () //返回队列中元素个数 ...

  9. STL容器底层数据结构的实现

    C++ STL 的实现: 1.vector      底层数据结构为数组 ,支持快速随机访问 2.list            底层数据结构为双向链表,支持快速增删 3.deque       底层 ...

  10. c++ STL 容器

    STL源码分析 (一)vector容器 vector的数据安排以及操作方式,与array非常相似.两者的唯一区别在于空间的运用的灵活性.array是静态空间,一旦配置了就不能改变.vector是动态空 ...

最新文章

  1. iOS动画进阶 - 手摸手教你写ShineButton动画
  2. opencv滤波美颜
  3. Hello World!!
  4. python模块 init py_Python模块包中__init__.py文件的作用
  5. 唯一标识计算机的位置目录与文件的是,计算机应用基础 7.doc
  6. Java 文件 IO 操作
  7. 60 MM配置-后勤发票校验-设置重复发票检查
  8. Windows Phone 8.1 多媒体(3):音乐
  9. 微信生成专属海报(专属二维码)
  10. spyder python下载_Spyder python下载
  11. cmdn发布博客(markdowm)
  12. 解读《美国国家BIM标准》– BIM能力成熟度模型(六)
  13. python词性标注_Python NLTK学习5(词性标注)
  14. 距阵乘以一个未知距阵得单位矩阵 怎么算_干货分享:怎样假装一个带货流水过亿的直播达人?...
  15. Assignment | 05-week3 -Part_1-Neural Machine Translation
  16. 手游测试(测试内容、测试流程、测试用例)
  17. 老男孩MysqlDBA专家班
  18. 【编程题】【Scratch三级】2022.06 五彩糖葫芦
  19. 尼康D7100_认识机身上的控件
  20. arduino 舵机接线图_arduino+16路舵机驱动板连接测试(示例代码)

热门文章

  1. webpack使用七
  2. J - X and Beasts
  3. Echarts关系图(使用重力图)
  4. Error:Execution failed for task ':app:clean'. Unable to delete directory: /media/file/workspaces/a
  5. 有关onpropertychange事件
  6. 热烈庆祝blog开通
  7. C语言的变量的作用域和生存期
  8. 深入理解Oracle Exadata
  9. Button.Text属性换行问题(Button.Bounds自动换行)
  10. JACK——PaintRobot Exercise6