数据结构之队列

欢迎来我家玩!

# 数据结构之队列



@(数据结构)[HickSalmon|队列|杭电1276]


**队列** 先进先出(First in first out)本篇为顺序结构
 
- **实现循环队列方式:**
- 队头队尾指针加1,可用取模(取余)运算实现
- 队头指针进1:front = (front + 1)% MAXLEN;
- 队尾指针进1: rear = (rear + 1)% MAXLEN;
- 队列初始化:front = rear = 0;
- 对空条件:front = rear;
- 队满条件:(rear + 1)% MAXLEN == front;


-------------------




## 题目描述
``` python
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下
的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从
头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
```
## 输入样例


2


20


40


## 输出样例
1 7 19


1 19 37
## 题目解析
题有两种报数方式;我们建立两个数组,一个用来存当前剩下的人,一个用来存报数之后的人员,直到最后少于四人为止。


## AC代码
```python
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 5002
using namespace std;
//创建一个队列结构体
struct Q
{
int f, r, da[N];
void init() {
f = r = 0;
}


void push(int a) {
da[r++] = a; 
}


int getTop() {
return da[f++];
}


bool check() {
return r - f < 4;
}


bool isEmpty() {
return f==r;
}
}Q[2];
int main()
{
int T, n, i;
scanf("%d", &T);//有两组数据需要输入,次数记录用T
while (T--)
{
scanf("%d", &n);//每一次要输入的人数用这个n保存
Q[0].init(), Q[1].init();
for (i = 1; i <= n; i++) {
Q[0].push(i);
}
int now = 0, pre= 1;
i = 0;
while (!Q[now].check()) {
Q[pre].init();
if (i & 1) {//或与非运算判断这里是12的报数方式还是123的报数方式
while (!Q[now].isEmpty()) {
Q[pre].push(Q[now].getTop());
if (Q[now].isEmpty())break;
Q[pre].push(Q[now].getTop());
if (Q[now].isEmpty())break;
Q[now].getTop();
}
}
else
{
while (!Q[now].isEmpty()) {
Q[pre].push(Q[now].getTop());
if (Q[now].isEmpty())break;
Q[now].getTop();
}
}
i ^= 1;//0与1之间的变换,以便让上面的报数方式进行选择
swap(now, pre);//交换工作队列
}
printf("%d", Q[now].getTop());
while (!Q[now].isEmpty()) {
printf(" %d", Q[now].getTop());
}
printf("\n");
}
return 0;
}
```



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值