展开字符串 字符模拟

这次测试,上来我就啃了这这个题,谁知半小时了,脑子还是一头雾水,别人已经刷了4道啦,没办法,只好先放一放。其他的做完菜回过头重新做。字符串里面,我一直不擅长字符指针,刚开始用字符指针去做,但是很吃力,因为要考虑结束符的问题。再看查题,里面的括号真是个问题,加上这次老师说是考递归,我想里面的括号难道是用递归脱去,但想想这样也太麻烦了吧。没办法,只好用那一招啦---查资料,人家说时先脱括号,从后面向前脱。感觉说的有道理,脱去的只要连起来就行啦,哎...有好几个童靴都提交啦,里面的数组需要小心,容易出错,我也是参考人家的格式,感觉还要多加练习才行啊.

no Code - -||
#include<stdio.h>
#include<string.h>
char str[500001];
char ans[500001];
char help[50001];
int n,len;

void fan2(int sum,char help[],char ans[],int k)
{
    int p,q;
    for(p=1;p<=sum;p++)
    {
        for(q=0;help[q]!=0;q++)
        {
            str[k++]=help[q];
        }
    }
    for(q=0;ans[q]!=0;q++)
    {
        str[k++]=ans[q];
    }            
    len=k;
}

void fan()
{
    int i,j;
    int p,q,k;
    int sum;
    for(i=n-1;i>=0;i--)
    {
        if(str[i]=='(')
        {
            for(j=i+1;;j++)
            {
                if(str[j]==')')
                {
                    help[j-i-1]=0;
                    break;
                }
                help[j-i-1]=str[j];
            }
            sum=0;
            p=1;
            while(i-1>=0&&str[i-1]>='0'&&str[i-1]<='9')
            {
                sum=(str[i-1]-'0')*p+sum;
                p=p*10;
                i--;
            }
            if(sum==0)
                sum=1;
            for(q=j+1;q<len;q++)
            {
                ans[q-j-1]=str[q];
            }
            ans[q-j-1]=0;
            k=i;
            fan2(sum,help,ans,k);

        }
        else if(str[i]>='0'&&str[i]<='9')
        {
            sum=0;
            p=1;
            j=i+1;
            while(i>=0&&str[i]>='0'&&str[i]<='9')
            {
                sum=(str[i]-'0')*p+sum;
                p=p*10;
                i--;
            }
            i++;
            if(sum==0)
                sum=1;
            if(j<n)
            {
                help[0]=str[j];
                help[1]=0;
                for(p=j+1;p<len;p++)
                {
                    ans[p-j-1]=str[p];
                }
                ans[p-j-1]=0;
                fan2(sum,help,ans,i);
            }
        }
    }
    str[len]=0;
}

int main()
{
    int k;

    scanf("%d",&k);
    while(k--)
    {
        scanf("%s",str);
        n=strlen(str);
        len=n;
        fan();
        printf("%s\n",str);

    }
    return 0;
}

 

posted @ 2012-08-18 11:03  煮人为乐  阅读(352)  评论(0编辑  收藏  举报