数据结构——队列

 队列和栈相反,队列(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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值