传送门:HDU - 1274
题目意思:给定一个简短的字符串,根据相关规则将其展开成完整的字符串
思路:自己编写栈函数、或直接递归(调用系统的栈)
递归步骤:1、读入字符,只要不是)
就读入,即进栈;
2、如果是数字,则记录,如果是字母,则默认缺省值为1;光标往后移读取数字后的字符;
3、如果是字母,则直接将字母按记录的次数循环输出;如果是(
,则按记录的次数循环递归,即递归处理括号内的子串;递归结束后记录下当前光标的位置;
4、当遇到)
时,说明单层递归完成,返回光标位置。
AC代码:
#include<iostream>
#include<cstdio>
using namespace std;
string s;
int ploy(int id)
{
int k,temp;
char c;
for(c=s[id++]; id<s.size()&&c!=')'; c=s[id++]){
for(k=0; isdigit(c); c=s[id++])
k=k*10+c-'0';//数字可能不止一位
if(!k) k=1;//没有数字的默认置1
if(c=='('){
while(k--) temp=ploy(id);//如果有括号,递归求解括号里面的
id=temp;//注意记录递归出来后光标的位置
}
else{
while(k--) putchar(c);//循环输出字符
}
}
if(c==')') return id;//返回光标位置
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
s.clear();
cin>>s;
ploy(0);
cout<<endl;
}
return 0;
}