• 展开字符串 字符模拟


    这次测试,上来我就啃了这这个题,谁知半小时了,脑子还是一头雾水,别人已经刷了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;
    }
  • 相关阅读:
    java-第二周学习总结
    春季总结
    第十二周作业
    第十一周作业
    第十周作业
    第九周作业
    第八周作业
    网络层思维导图
    数据链路层思维导图
    Mysql数据库的基本操作之建表操作(2)
  • 原文地址:https://www.cnblogs.com/zibuyu/p/2645193.html
Copyright © 2020-2023  润新知