1 #include<stdio.h> 2 #include<ctype.h> 3 #include<string.h> 4 char s[260]; 5 int dfs(int ith) 6 { 7 int k,e; 8 char c; 9 for(c=s[ith++];ith<strlen(s)&&c!=')';c=s[ith++])//递归结束的条件是字符串结束或遇到右括号 10 { 11 for(k=0;isdigit(c);c=s[ith++]) 12 k=k*10+c-'0'; 13 if(!k) k=1; 14 if(c=='('){ 15 while(k--) 16 e=dfs(ith); 17 ith=e;//重置ith的值,到下层递归结束的位置 18 } 19 else{ 20 while(k--) 21 putchar(c); 22 } 23 } 24 if(c==')') return ith;//返回本次读到结尾的位置 25 } 26 int main() 27 { 28 int n; 29 scanf("%d",&n); 30 while(n--) 31 { 32 scanf("%s",s); 33 dfs(0);//进入递归 34 printf("\n"); 35 } 36 return 0; 37 }
//一个很不错的递归题,我主要的过程就如一般的表达式求解,遇到左括号进入下层递归,
//否则一直按每个字母前面的数字决定其输出的次数,括号也是如此,而递归结束的标志
//则是遇到 右括号或者到字符串的结尾,注意每次递归结束需要返回下次遍历的序号