FIFO队列和优先队列

简介: FIFO队列和优先队列

定义简单的FIFO队列和优先队列

1. //使用队列必须包含 <queue> 头文件
2. queue<int>que;//定义que为一个int类型的FIFO队列 
3. queue<char>a;//定义a为一个char类型的FIFO队列 
4. queue<data>c;//定义c为一个date类型的FIFO队列
5. //data为自定义的数据类型,可以为结构体 
6. priority_queue<int>heap;//定义heap为一个int类型的优先队列 
7. priority_queue<double>k;//定义k为一个double类型的优先队列
8. //这两种定义方式都是大根堆,想要使其变成小根堆,可以将每个数据都乘以-1

定义结构体的优先队列

1. struct data{
2.  int x;
3.  bool operator<(const data &a)const{//const一定要写 
4.    return a.x<x;//等于小根堆 
5.  }
6. };
7. priority_queue<data>q;//q优先队列的优先规则由data重载小于号决定

FIFO队列和优先队列的操作

q.empty()    如果队列为空,则返回true,否则返回false

q.size()       返回队列中元素的个数

q.pop()       删除队首元素,但不返回其值

q.front()      返回队首元素的值,但不删除该元素(仅适用于FIFO队列)

q.back()     返回队尾元素的值,但不删除该元素(仅适用于FIFO队列)

q.top()        返回具有最高优先级的元素的值,但不删除该元素(仅适用于优先队列

q.push()     对queue,在队尾压入一个新元素 对于priority_queue,在基于优先级的适当位置插入新元素

用优先级队列解决【合并果子问题】

题目内容如下:

在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。

每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。

因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。

例如有3种果子,数目依次为1,2,9。可以先将1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以多多总共耗费体力=3+12=15。可以证明15为最小的体力耗费值。

【Input】

输入包括两行,第一行是一个整数n(1<=n<=10000),表示果子的种类数。第二行包含n个整数,用空格分隔,第i个整数ai(1<=ai<=20000)是第i种果子的数目。

【】Output

输出包括一行,这一行只包含一个整数,也就是最小的体力耗费值。输入数据保证这个值小于2^31。

【Sample Input 】

3

1 2 9

【Sample Output 】

15

【Hint】

对于30%的数据,保证有n<=1000:

对于50%的数据,保证有n<=5000;

对于全部的数据,保证有n<=10000

1. #include<stdio.h>
2. #include<queue>
3. #include<iostream>
4. using namespace std;
5. priority_queue<int>que;
6. int main()
7. {
8.  int n,x;
9.  scanf("%d",&n);
10.   for(int i=0;i<n;i++){
11.     scanf("%d",&x);
12.     que.push(-x);//小根堆 
13.   }
14.   int ans=0;
15.   for(int i=1,tmp;i<n;++i){
16.     tmp=que.top();
17.     ans-=que.top();
18.     que.pop();
19.     tmp+=que.top();
20.     ans-=que.top();
21.     que.pop() ;
22.     que.push(tmp);
23.   }
24.   cout<<ans<<endl;
25.   return 0;
26.  }
1. #include<stdio.h>
2. #include<queue>
3. #include<iostream>
4. using namespace std;
5. priority_queue<int>que;
6. int main()
7. {
8.  long long ans=0,f1,f2,temp;
9.  int n;
10.   priority_queue<long long,vector<long long>,greater<long long> >q;
11.   //数字小的优先级大 vector时底层存储堆的结构
12.   scanf("%d",&n);
13.   for(int i=0;i<n;i++){
14.     scanf("%d",&temp);
15.     q.push(temp);
16.   }
17.   while(q.size()>1){
18.     f1=q.top();
19.     q.pop();
20.     f2=q.top();
21.     q.pop();
22.     q.push(f1+f2);
23.     ans+=f1+f2;
24.   }
25.   printf("%lld",ans);
26.   return 0;
27.  }

 

相关文章
|
8月前
|
存储 安全 Java
阻塞队列《——》特殊的队列(先进先出)
阻塞队列《——》特殊的队列(先进先出)
26 0
|
1月前
深入了解队列:探索FIFO数据结构及队列
深入了解队列:探索FIFO数据结构及队列
43 0
|
1月前
队列的实现
队列的实现
|
6月前
|
C++
c++ 队列
队列的数据结构
25 0
|
10月前
|
算法 调度 C++
队列(Queue):先进先出的数据结构队列
队列(Queue):先进先出的数据结构队列
145 0
|
11月前
|
存储
队列的实现(下)
队列的实现(下)
|
存储
瞬解 队列 -- 循环队列问题(超超超详解)
瞬解 队列 -- 循环队列问题(超超超详解)
51 0
|
存储
队列的使用
队列的使用
69 0
|
存储
队列?是你了解的这样吗?
队列?是你了解的这样吗?
90 0
队列?是你了解的这样吗?