一、用法 特点:先进先出 队列操作 1.求队列的第一项 队列名.front() 2.求队列的最后一项 队列名.back() 3.求队列的长度 队列名.size() 4.弹出队列的第一个元素 队列名.pop() 5.将一个元素放入队列 队列名.push() 6.判断队列是否为空 队列名.empty() 二、例题 题目:Throwing cards away I UVA - 10935 链接:https://vjudge.net/problem/UVA-10935 题解:对队头队尾元素进行操作,所以用queue 代码:
#include<queue> #include<cstdio> #include<iostream> #define maxn 100 using namespace std; queue<int>q,chu; int main() { int n; while(scanf("%d",&n)!=EOF&&n!=0) { while(!q.empty()) q.pop(); while(!chu.empty()) chu.pop(); for(int i=1;i<=n;i++) q.push(i); while(q.size()>1) { int tt; tt=q.front();//删除的元素 chu.push(tt); q.pop();//剔除最上面的 if(q.size()<=1) break; int t=q.front(); q.pop(); q.push(t); } int flag=1;//判断是否要加, printf("Discarded cards: "); while(!chu.empty()) { if(!flag) cout<<", "; cout<<chu.front(); chu.pop(); flag=0; } cout<<endl; printf("Remaining card: %d\n",q.front()); q.pop(); } return 0; }题目:周末舞会-队列 题目链接:http://acm.nefu.edu.cn/problemShow.php?problem_id=1632 题解:注意一场曲目只有一对舞伴 代码:
#include<queue> #include<iostream> #include<cstdio> using namespace std; int main() { int m,w;//男生女生的数目 queue<int>man,woman; scanf("%d%d",&m,&w); for(int i=1;i<=m;i++) man.push(i); for(int i=1;i<=w;i++) woman.push(i); int n;//曲目的数目 scanf("%d",&n); while(n--) { int mt=man.front(); int wt=woman.front(); printf("%d %d\n",mt,wt); man.pop(); woman.pop(); man.push(mt); woman.push(wt); } return 0; }题目:报数-队列-约瑟夫环 题目链接:http://acm.nefu.edu.cn/problemShow.php?problem_id=1634 题解:类似于猴子选大王的问题,巧妙地想成一个队列,然后操作 代码:
#include<queue> #include<iostream> #include<cstdio> using namespace std; queue<int>que; int main() { int n,m;//小朋友的个数,报数的序号 scanf("%d%d",&n,&m); while(!que.empty()) que.pop(); for(int i=1;i<=n;i++) que.push(i); int con=0;//计数的编号 while(que.size()>1) { int t=que.front(); con++; que.pop(); if(con==m) con=0; else que.push(t); } cout<<que.front()<<endl; return 0; }例题:酒桌游戏-队列 链接:http://acm.nefu.edu.cn/problemShow.php?problem_id=1635 代码:
#include<iostream> #include<queue> #include<string> #define maxn 10000 using namespace std; queue<int>q; string s[maxn]; bool solve(int k) { while(k!=0) { if(k%10==7) return true; k/=10; } return false; } int main() { int n,bnum,bpeo;//人数,开始报号的数,开始报号的人 scanf("%d%d%d",&n,&bpeo,&bnum); for(int i=1;i<=n;i++) { cin>>s[i]; q.push(i); } while(q.front()!=bpeo) { int t=q.front(); q.push(t); q.pop(); } while(q.size()>1) { int t=q.front(); q.pop(); if(bnum%7!=0&&solve(bnum)==false)//不会被淘汰 q.push(t); bnum++; } cout<<s[q.front()]<<endl; return 0; }优先队列 链接:https://blog.csdn.net/weixin_36888577/article/details/79937886