HDU ACM 1274 展开字符串

来源:互联网 发布:3.3v单片机收发5v信号 编辑:程序博客网 时间:2024/06/05 20:28

使用栈操作,一次展开即可,如果递归调用则会栈溢出。

#include<iostream> using namespace std;int stack[550];      //栈int top;             //栈顶void f(char* p){int k,i,j;i=0;if(*(p+i)>='a' && *(p+i)<='z')   //字母前面是否有重复次数,因为1可以省略k=1;    else        k=0;while(*(p+i)!=NULL){if(*(p+i)>='0' && *(p+i)<='9')    //计算重复次数{k=k*10+(*(p+i)-'0');i++;}else if(*(p+i)=='('){if(k==0) k=1;         //如要压栈就最少重复一次stack[top++]=--k;              //压栈操作stack[top++]=i;if(*(p+i+1)>='a' && *(p+i+1)<='z')        k=1;        else        k=0;i++;}else if(*(p+i)!=')'){for(j=0;j<k;j++)putchar(*(p+i));i++;if(*(p+i)==NULL) break;if(*(p+i)>='a' && *(p+i)<='z')k=1;else k=0;}else if(*(p+i)==')')             //出栈操作if(stack[top-2])             //还有重复次数则继续当前栈帧{stack[top-2]--;i=stack[top-1];    if(*(p+i+1)>='a' && *(p+i+1)<='z')            k=1;            else            k=0;i++;}else                      //无重复次数则出栈{top-=2;i++;if(*(p+i)==NULL) break;    if(*(p+i)>='a' && *(p+i)<='z')    k=1;    else k=0;}}}int main()  {char a[260];int n;cin>>n;getchar();while(n--){gets(a);top=0;f(a);         //问题求解cout<<endl;}    return 0;  }


0 0