团队队列问题

这篇博客介绍了如何实现一个模拟特定规则的团队队列程序。每个成员进入队列时会检查已有队友,如果找到则插入到队友后面,否则添加到队尾。出队则按常规顺序进行。示例展示了输入输出格式,并给出了一段C++代码实现,但遇到了某个情况的错误以及输入字符串处理的警告。
摘要由CSDN通过智能技术生成

【问题描述】

     在团队队列中每个成员都属于一个团队,如果一个成员进入队列,它首先从头到尾搜索队列,以检查它的一些队友(同一队的成员)是否已经在队列中,如果是,它会进入到该团队的后面,如果不是,它会从尾部进入队列并成为新的最后一个成员。成员出队是按常规队列操作,按照出现在队列中的顺序从头到尾进行处理。你的任务是编写一个模拟这样的团队队列的程序。

【输入形式】

     每个测试用例都以团队个数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不成功;

输入字符串的方式被警告

将&删去

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值