【数据结构】队列
2013-08-29 15:46
260 查看
1.介绍
1.1 队列
与栈一样,队列(queue)也是一种基本的数据结构,也有两种的基本操作:push和pop;与栈不一样的是,操作限制在队列的两端。push是从队尾(rear)插入元素,即入列;pop是从队首删除元素,即出列。在出列过程中,要判断队列是否为空。队列可以用数组进行模拟,也可以用链表作为存储。1.2 优先级队列
有一种特殊的队列:优先级队列,根据元素的优先级删除元素。比如,优先级高的元素先被删除,这样的队列称为最大值优先级队列(max priority queue);同理,优先级低的元素先被删除,这样的队列被称为最小值优先级队列(min priority queue)。STL中priority_queue已经实现了优先级队列。模板声明:priority_queue<Type, Container, Functional>。Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list。
若后面两个参数缺省的话,默认优先队列就是最大值优先级队列(大顶堆),队头元素最大。STL里面定义了一个仿函数 greater<>,可以用这个仿函数声明最小值优先级队列(小顶堆):priority_queue<int, vector<int>, greater<int> > q 。
2. Referrence
[1] Darren,priority_queue用法 。3.问题
3.1 POJ 3125
题目是关于优先级调度,每个job有一个0~9的优先级,优先级高的先打印,同等优先级的在排在队列前面的先打印。思路:用prio_count[ i ]记录优先级为i的job个数,i的初始值置为9,每一次循环后减1;若i减至priority[m],且队首元素为m,整个循环结束;否则,进入下面的步骤;通过判断队首优先级==i,若相等,则出列;若不等,则将队首元素插入队尾。
一次提交AC,幸之。
源代码:
3125 | Accepted | 128K | 0MS | C++ | 906B | 2013-08-29 15:08:43 |
#include <iostream> #include <queue> using namespace std; #define MAX 100 int main() { /*pop_count represents the count of dequeue prio_count represents the count of priority 0 ~ 9*/ int testcases,n,m,i,pop_count; int priority[MAX],prio_count[10]; queue<int>que; scanf("%d",&testcases); while(testcases--) { scanf("%d%d",&n,&m); /*initialization and clear the queue*/ pop_count=0; memset(prio_count,0,sizeof(prio_count)); while(!que.empty()) que.pop(); /*push jobs to the queue, get the count of priority 0 ~ 9*/ for(i=0;i<n;i++) { scanf("%d",&priority[i]); prio_count[priority[i]]++; que.push(i); } for(i=9;i>=priority[m];i--) { while(prio_count[i]) { /*indicate that your job gets its turn to print*/ if(i==priority[m]&&que.front()==m) { pop_count++; break; } else { if(priority[que.front()]==i) { que.pop(); pop_count++; prio_count[i]--; } else { que.push(que.front()); que.pop(); } } } } printf("%d\n",pop_count); } return 0; }
3.2 POJ 1442
题目大意:求输入的前u(i)个数中第i大的数。思路:用最大值优先级队列que1记录前i个数,即从大到小排列;用最小值优先级队列que2记录后u(i)-i个数,即从小到大排列;则que1的队首元素即为u(i)个数中的第i大。
WA了两次,在语句if(que1.size()<i){……}犯了逻辑错误。
源代码:
1442 | Accepted | 756K | 157MS | C++ | 823B | 2013-09-17 19:48:06 |
#include <iostream> #include <queue> using namespace std; #define MAX 30001 priority_queue<int>que1; priority_queue<int,vector<int>,greater<int> >que2; int main() { int N,M,i,j; int A[MAX],u[MAX]; scanf("%d%d",&M,&N); for(i=0;i<M;i++) scanf("%d",&A[i]); u[0]=0; for(i=1;i<=N;i++) scanf("%d",&u[i]); for(i=1;i<=N;i++) { if(u[i-1]<u[i]) { for(j=u[i-1];j<u[i];j++) { if(que1.size()<i) { que2.push(A[j]); que1.push(que2.top()); que2.pop(); } else { if(que1.top()>A[j]) { que2.push(que1.top()); que1.pop(); que1.push(A[j]); } else que2.push(A[j]); } } } else { que1.push(que2.top()); que2.pop(); } printf("%d\n",que1.top()); } return 0; }
相关文章推荐
- 【数据结构】用模版实现大小堆、实现优先级队列,以及堆排序
- 数据结构学习笔记之表、栈、队列
- 数据结构-栈和队列
- 数据结构-队列顺序结构的实现和操作
- 常用数据结构之链式存储队列
- (hdu step 8.1.6)士兵队列训练问题(数据结构,简单模拟——第一次每2个去掉1个,第二次每3个去掉1个.知道队伍中的人数<=3,输出剩下的人 )
- java实现数据结构中的环形队列
- 内核数据结构:链表,队列,映射二叉树
- 数据结构学习记录连载9(队列的学习)
- python数据结构与算法——队列
- 队列相关习题及详解(选择题和综合题) ——数据结构
- 数据结构小结 (三)栈与队列
- 队列的实现---数据结构学习(五)
- 数据结构学习——栈与队列
- 数据结构-队列
- JAVA数据结构--队列
- c++实现数据结构八 链式队列
- 数据结构:双向链表实现队列与循环链表
- 数据结构(23)队列--单链表实现
- 【数据结构】用两个栈实现队列