这个题是我放了好久才过的:开始的时候,我的思路并没有错误,不过程序的逻辑上有问题,对于,team_num.cout 在data出栈时我忘了变化。后来,我花费了一个晚上,终于找到错误所在,真的是找自己的错误比挑别人的错误难的多啊,顺着自己的思路找了好久也没找到。最后,在大神的一组数组测试下。我终于找到了wrong;由此,我在说一句我颇有感触的一句话:对于一个看着非常复杂的题或者一个程序,从心底里你不能害怕它,要勇敢的面对才是。
先插入一组测试数据:
4
4 0 1 2 3
4 4 5 6 7
4 8 9 10 11
4 12 13 14 15
ENQUEUE 6
ENQUEUE 14
ENQUEUE 1
ENQUEUE 11
ENQUEUE 2
ENQUEUE 4
ENQUEUE 13
ENQUEUE 15
ENQUEUE 12
ENQUEUE 7
ENQUEUE 9
ENQUEUE 10
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
ENQUEUE 8
ENQUEUE 12
ENQUEUE 6
ENQUEUE 3
ENQUEUE 5
ENQUEUE 1
ENQUEUE 4
ENQUEUE 15
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
STOP
0
Scenario #1
6
4
7
14
13
15
12
1
2
3
1
11
9
10
8
12
15
6
5
4
代码如下:
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
struct list
{
int l_data;
list *next;
};
struct teamnum
{
list *head, *tail;
int count;//记录该分组现有已入栈的成员数
};
int team_mate[1000050];//记录data对应的分组
teamnum team_num[1050];//记录栈中目前的组目情况
list *head = NULL;
int input (int n)
{
int t,data;
for(int i = 1; i <= n; i++)
{
cin>>t;
for(int j = 0; j < t; j++)
{
cin>>data;
team_mate[data] = i;
}
}
return 0;
}
int enqueue ()
{
int teg;
cin>>teg;
list *p = new list;
p->l_data = teg;
p->next = NULL;
if(head == NULL)//空表情况
{
head = p;
head -> next = NULL;
team_num[team_mate[teg]].count++;
team_num[team_mate[teg]].head = head;
team_num[team_mate[teg]].tail = head;
}
else
{
if(team_num[team_mate[teg]].count == 0)//栈中木有自家成员
{
list *q;
for(q = head; q -> next!=NULL; q = q->next);
q -> next = p;
team_num[team_mate[teg]].count++;
team_num[team_mate[teg]].tail = team_num[team_mate[teg]].head = p;
}
else//栈中已有自家成员
{
list *q;
team_num[team_mate[teg]].count++;
q = team_num[team_mate[teg]].tail;
p -> next = q -> next;
q -> next = p;
team_num[team_mate[teg]].tail = p;
}
}
return 0;
}
int dequeue ()//出栈
{
list *q = head;
cout<< head->l_data<<endl;
team_num[team_mate[head->l_data]].count--;//错误一:出栈时,忘了对count变化!!!
team_num[team_mate[head->l_data]].head = head->next;
head = head->next;
delete q;
return 0;
}
int main ()
{
int n;
int num = 0;
while(cin>>n&&n)
{
memset(team_mate,0,sizeof(team_mate));
memset(team_num,0,sizeof(team_num));
cout<<"Scenario #"<<++num<<endl;
head = NULL;
input(n);
string temp;
while(1)
{
cin>>temp;
if(temp == "ENQUEUE")
enqueue();
else if(temp == "DEQUEUE")
dequeue();
else if(temp == "STOP")
break;
}
cout<<endl;
}
return 0;
}