UVa540队列入门例题(包括使用函数)

#include<iostream>
#include<stdio.h>
#include<queue>
#include<string>
#include<map>

using namespace std;


int main(){
      int Case,n,t,N,k=1,maxn=1010;
      char str[15];
      map<int, int>team;
      st:scanf("%d",&Case);
      if(Case==0) return 0;
      printf("Scenario #%d\n",k);
      queue<int> q,q2[maxn];
      while(Case--){
          scanf("%d",&n);
          for(int i = 0 ; i<n ; i++){
               scanf("%d",&N);
               team[N] =  Case;
          }
      }
      for(;;){
              scanf("%s",str);
              if(str[0]=='E'){
                   scanf("%d",&n);
                   t = team[n];
                   if(q2[t].empty()){
                          q.push(n);
                          q2[t].push(n);
                   }else{
                          q2[t].push(n);
                   }
              }
              if(str[0]=='D'){
                   t = q.front();
                   if(q2[team[t]].empty()&&q.empty()) {
                         continue;
                   }
                   if(q2[team[t]].size()==1){
                         printf("%d\n",q2[team[t]].front());
                         q2[team[t]].pop();
                         q.pop();
                   }else{
                      printf("%d\n",q2[team[t]].front());
                      q2[team[t]].pop();
                   }
              }
              if(str[0]=='S') {
                 printf("\n");
                 k++;
                 goto st;
              }
          }
}

1.先使用map将各队队员的号码与队伍号码一一对应 map<int,int>team;

      2.创造两个队列,一个是每个队伍中第一个进队的队员号码的队列;(queue<int>q;)
                                一个是每个队伍中自己队员的队列;  (定义一个一位数组队列及queue<int>q2[maxn];)

      3.主要思路:

     错误点:
                  1.当命令为"STOP"时的判断语句if出错,只管了一个语句,结果导致每一条命令无论是什么都会执行goto

                  2.一开始想着如果出现弹出命令时,直接弹出这个成员的团队的所有人,没有考虑到弹出和插入命令可能交叉
                     最后可能队列中还会有成员的情况

                  3.当成员队列为空时,忘记删除团队队列中的首位成员

     用时:4小时

     收获:1.对队列和map映射有了一个清楚的认识和了解。
               2.基本上其实自己的思路很少会出现错误,如果思路出现错误,一般是没有考虑全面,漏掉一些情况
                  一般来说,我的错误集中在循环条件和判断条件上,以后如果调试,多往这方面看和测试。

    C++队列Queue类成员函数如下:

      关于队列的基本操作:https://blog.csdn.net/l494926429/article/details/52067004
                  back() 返回最后一个元素

                  empty() 如果队列空则返回真

                  front() 返回第一个元素

                  pop() 删除第一个元素

                  push() 在末尾加入一个元素

                  size() 返回队列中元素的个数

                  清除队列没有方法,但可以使用
                  void clear(queue<int>& q) {
                           queue<int> empty;
                           swap(empty, q);
                   }
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值