Uva--540 (队列 or 线性表)

2014-06-17 21:50:29

题意&思路:有n个队伍,并给出每支队伍的成员号码,对于每个ENQUEUE  x 命令, 如果x所在的队伍已经在队列中, 则x排在队列中它的队伍的尾巴,否则排在队列的末尾。 每次DEQUEUE命令,把front元素取出并输出来,也就是队中有队了。可以用二维队列来做,我的话用链表来做,相当于模拟了二维队列,有点挫,但理清逻辑还是挺容易理解的。(看做是一串链表,每个节点下面可能还挂着几个节点)

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <string>
 4 #include <iostream>
 5 using namespace std;
 6 
 7 struct node{
 8     int v;
 9     node *right,*hang,*tail; //tail有点特别,指向最后一个元素
10     node(){
11         right = hang = NULL;
12         tail = this;
13     }
14 };
15 int team[1000005];
16 int main(){
17     int t,Case = 0,tmp,cnt,val;
18     char str[30];
19     while(scanf("%d",&t) == 1){
20         if(t == 0) break;
21         node *root = new node;
22         memset(team,0,sizeof(team));
23         for(int i = 1; i <= t; ++i){
24             scanf("%d",&cnt);
25             for(int j = 1; j <= cnt; ++j){
26                 scanf("%d",&tmp);
27                 team[tmp] = i;
28             }
29         }
30         printf("Scenario #%d\n",++Case);
31         while(scanf("%s",str) == 1){
32             if(str[0] == 'S') break;
33             if(str[0] == 'E'){
34                 scanf("%d",&val);
35                 int flag = 0;
36                 node *p = root;
37                 node *q = new node;
38                 q->v = val;
39                 while(p->right != NULL){
40                     if(team[p->right->v] == team[val]){
41                         flag = 1;
42                         p->right->tail->hang = q;
43                         p->right->tail = q;
44                         break;
45                     }
46                     p = p->right;
47                 }
48                 if(!flag)
49                     p->right = q;
50             }
51             else{
52                 node *p = root;
53                 node *q = p->right;
54                 printf("%d\n",q->v);
55                 if(p->right->hang == NULL)
56                     p->right = q->right;
57                 else{
58                     q->hang->tail = q->tail;
59                     q->hang->right = q->right;
60                     p->right = q->hang;
61                 }
62             }
63         }
64         puts("");
65     }
66     return 0;
67 }

 

转载于:https://www.cnblogs.com/naturepengchen/articles/3793567.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值