【数据结构】队列
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,幸之。 源代码:
#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,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("%dn",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){……}犯了逻辑错误。 源代码:
#include <iostream>
#include <queue>
using namespace std;
#define MAX 30001
priority_queue<int>que1;
priority_queue<int,greater<int> >que2;
int main()
{
int N,M,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("%dn",que1.top());
}
return 0;
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 小蚂蚁学习Bootstrap(2)——轮播广告carousel和栅格系统布
- Bootstrap DateTimePicker选择月份BUG
- Angular Compiler选项
- angularjs – Angular Bootstrap Dropdown在Angular Fullst
- angularjs – 如何使用jasmine测试$timeout操作的持续时间?
- [Scala基础]--Either介绍
- 在AngularJS中,ng-pristine和ng-dirty有什么区别?
- Dockerfile将主机用户UID和GID复制到映像
- Linux查找处理文件名后包含空格的文件(两种方法)
- angularjs – 如何获取ng-repeat中的上一项?
