【问题描述】
在团队队列中每个成员都属于一个团队,如果一个成员进入队列,它首先从头到尾搜索队列,以检查它的一些队友(同一队的成员)是否已经在队列中,如果是,它会进入到该团队的后面,如果不是,它会从尾部进入队列并成为新的最后一个成员。成员出队是按常规队列操作,按照出现在队列中的顺序从头到尾进行处理。你的任务是编写一个模拟这样的团队队列的程序。
【输入形式】
每个测试用例都以团队个数t开始(1≤t≤1000),然后是团队描述,每个描述包含属于团队的成员个数和成员编号列表,成员编号为0到999999之间的整数,一个团队最多可以包含1000个成员。然后是一系列命令,有三种不同的命令:
① ENQUEUE p:成员p进入队列。
② DEQUEUE:队列中第一个成员出来并将其从队列中删除。
③ STOP:当前测试用例结束。
输入以t=0结束。
【输出形式】
对于每个DEQUEUE命令,以单独一行输出出队的成员。
【样例输入】
2
3 101 102 103
3 201 202 203
ENQUEUE 101
ENQUEUE 201
ENQUEUE 102
ENQUEUE 202
ENQUEUE 103
ENQUEUE 203
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
STOP
【样例输出】
101
102
103
201
202
203
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
using namespace std;
queue<int> Q;
queue<int> team[1001];
char ch[30];
int mem[1000005];//存放所有成员,大数组定义在主函数外
int main(){
int teamn,memn,p;
freopen("in.txt","r",stdin);
scanf("%d",&teamn);
memset(mem,0,sizeof(mem));
for(int i = 1;i <= 1000;++ i){
while(!team[i].empty())//队伍栈非空清空
team[i].pop();
}
while(!Q.empty())
Q.pop();
for(int i = 0;i < teamn;i++){
scanf("%d",&memn);
for(int j = 0;j < memn;j++){
scanf("%d",&p);
mem[p] = i;
}
}//初始化
while(scanf("%s",&ch)){
if(ch[0] == 'S')//stop
break;
if(ch[0] == 'E'){//进入队列
scanf("%d",&p);
if(team[mem[p]].empty()){
Q.push(p);
team[mem[p]].push(p);
}//某队第一个入队
else{
team[mem[p]].push(p);//有队友直接插队
}
}
if(ch[0] == 'D'){//出队
printf("%d\n",team[mem[Q.front()]].front());
team[mem[Q.front()]].pop();//出队
if(team[mem[Q.front()]].empty())//团队走完
Q.pop();
}
}
return 0;
}
不知道为什么team1000000不成功;
输入字符串的方式被警告:
将&删去