问题 Q: 大爱线性表
时间限制: 1 Sec 内存限制: 128 MB
提交: 3561 解决: 779
[提交][状态][讨论版]
题目描述
不少参赛同学刚学数据结构,对线性表最是熟悉不过。这里我们给线性表增加两个特殊的操作,第一个是‘R’ 操作,表示逆转整个表,如果表长为L,原来的第i个元素变成第L-i+1个元素。第二个操作是‘D’,表示删除表的第一个元素,如果表为空,则返回一个“error”信息。我们可以给出一系列的‘R’ 和‘D’组合,例如“RDD”表示先逆转表,然后删除最前面的两个元素。
本题的任务是给定表和一个操作串S,求出执行S后的表,如果中途出现‘D’操作于空表,输出“error”。
输入
第一行是一个整数,表示有多少组数据。每组测试数据格式如下:
(1)第一行是操作串S,有‘R’ 和‘D’组成,S的长度大于0,不超过100 000。
(2)第二行是整数n,表示初始时表中的元素个数。n的值不小于0,不超过100 000。
(3) 第三行是包含n个元素的表,用‘[’ 和 ‘]’括起来,元素之间用逗号分开。各元素值在[1,100]之间。
输出
对于每一组测试数据,输出执行S后的表(格式要求同输入)或者“error”。
样例输入
4
RDD
4
[1,2,3,4]
DD
1
[42]
RRD
6
[1,1,2,3,5,8]
D
0
[]
样例输出
[2,1]
error
[1,2,3,5,8]
error
分析:这题直接用数组就可以解决了,但是我没有用数组,而是用双向循环链表,创新一下,当然为此付出代价,终极bug是不能用fflush,还好老师帮我找出来了,不然不知道陷进这个坑多深。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define maxsize 500000
char s[maxsize],l1[maxsize],l2[maxsize][10],d[10];
int n,flag;
typedef struct listnode
{
char data[10];
struct listnode *prior,*next;
}listnode,*list;
void initlist(list &Q,list &R)
{
Q=new listnode;
R=new listnode;
Q->next=R;
Q->prior=R;
R->prior=Q;
R->next=Q;
}
void creatlist(list &Q,list &R)
{
list p,q=Q;
if(n)
{
int i;
for(i=0;i<n;i++)
{
p=new listnode;
strcpy(p->data,l2[i]);
q->next=p;
p->prior=q;
p->next=R;
R->prior=p;
q=p;
}
}
}
void Delete(list &Q,list &R)
{
if(flag==1)
{list d,p;
d=Q->next->next;
p=Q->next;
Q->next=d;
d->prior=Q;
free(p);}
if(flag==-1)
{
list d,p;
d=Q->prior->prior;
p=Q->prior;
Q->prior=d;
d->next=Q;
free(p);
}
}
void change(list &Q,list &R)
{
list p;
p=new listnode;
p=Q;
Q=R;
R=p;
}
int main()
{
int num;
int i,j,k;
scanf("%d",&num);
list Q,R;
getchar();
initlist(Q,R);
while(num--)
{
flag=1;
//fflush(stdin);
gets(s);
scanf("%d",&n);
getchar();
//fflush(stdin);
gets(l1);
j=0;
k=0;
if(n)
{
for(i=0;l1[i]!='\0';i++)
{
if(l1[i]!='['&&l1[i]!=','&&l1[i]!=']')
d[j++]=l1[i];
else
{
if(l1[i]==','||l1[i]==']')
{
d[j++]='\0';
j=0;
strcpy(l2[k++],d);
}
}
}
creatlist(Q,R);
for(i=0;s[i]!='\0';i++)
{
if(s[i]=='D')
{
if(Q->next==R&&flag==1||Q->prior==R&&flag==-1)
{
printf("error");n--;
break;
}
Delete(Q,R);n--;
}
if(s[i]=='R')
{flag=-flag;change(Q,R);}
}
if(n>0)
{ list k;
if(flag==1)
k=Q->next;
if(flag==-1)
k=Q->prior;
printf("[");
for(i=0;i<n-1;i++)
{
if(k!=R)
{
printf("%s,",k->data);
if(flag==1)
k=k->next;
if(flag==-1)
k=k->prior;
}
}
printf("%s]",k->data);
}
else
{
if(n==0)
printf("[]");
}
}
else
{
int l=1;
for(i=0;s[i]!='\0';i++)
if(s[i]=='D')
{printf("error");l=0;break;}
if(l)
printf("[]");
}
printf("\n");
}
}