大爱线性表

问题 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"); 
    } 
} 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涛歌依旧fly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值