队列和栈相反,队列(queue)是一种先进先出(FIFO:first in first out)的线性表。它只允许在表的一端进行插入,而在另一端删除元素。队列和我们日常生活中的排队是一致的,最早进入队列的元素最早离开。在队列中,允许插入的一端叫队尾(tear),允许删除的一端称为队头(front)
1.定义队列
#include <queue>
queue<int>que;
手写:
int que[100010],fr,rr;
2.队列存入
que.push(x);
手写:
que[fr++]=x;
3.删除头顶元素
int x=que.pop();
手写
int x=que[fr++];
仅删除:fr++;
4.取头顶元素
int x=que.top();
手写:
int x=que[rr];
5.查看长度
int x=que.size();
手写:
int x=rr-fr;
6.是否为空
bool x=que.empty();
手写:
bool x=(fr==rr);
7.清空队列
while(!que.empty()) que.pop();
手写:
fr=rr;
来 see 一道题
Bessie 正在使用一堆共 K张(N≤K≤100,000; K是 N 的倍数)纸牌与 N-1 个(2≤N≤100)朋友玩取牌游戏。 纸牌中共包含 M=K/N 张 “good” 牌和 K−M 张 “bad” 牌。 Bessie 负责发牌,她当然想独占所有 “good” 牌,因为她喜欢赢。
她的朋友怀疑她会耍诈,所以他们给出如下一些限制:
(1)游戏开始时,将最上面的牌发给Bessie 右手边的人;
(2)每发完一张牌,她必须将接下来的 P张牌 (1≤P≤10) 一张一张地依次移到最后放在牌堆的底部。
(3)以逆时针方式持续给每位玩家发牌.
Bessie 迫切想赢,请你帮助她算出所有 “good” 牌放置的位置,以便 Bessie得到所有 “good” 牌。 牌从上到下依次按 1,2,3,… 编号。
格式
输入
第一行,三个用空格间隔的整数: N, K, P
输出
M行,从顶部按升序依次输出 “good” 牌的位置
Samples
输入数据 1
3 9 2
输出数据 1
3 7 8
样例讲解:
card
#include <bits/stdc++.h>
using namespace std;
const int N = 1.1e6 + 7, M = 5e4 + 7;
int qv[N],a[M],l,f,r,n,k,p;
int main(){
cin>>n>>k>>p;
for(int i=1;i<=k;++i) qv[r++]=i;//存i张牌
for(int i=1;i<=k; ++i) {
if (!(i%n))a[++l]=qv[f];//存bessie的牌
++f;//把那张牌扔掉
for(int j=1;j<=p;++j)
qv[r++]=qv[f++];//把p张牌放到后面,可以用queue写成qv.push(qv.pop());
}
sort(a+1, a+1+l);//排序
for (int i=1;i<=l;++i)cout<<a[i]<<endl;
return 0;
}