​传送门​

题目大意

给你一个串,构成一棵树。然后对数进行先序遍历输出。其中,整个串由节点名字( ). 组成,遇到一个括号时,当前左括号是当前括号内节点的父节点,括号内用’,'隔开的是兄弟节点,整体就是一颗树;

思路

首先将每个字符串分离出来,方式多样。然后模拟进栈出栈操作。
不管遇到什么都进栈,遇到,或)出栈

代码

char str[maxn];
char sh[120],ch[50005][120];

int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%s",str);
int len=strlen(str);
int flag=true;
int num=0,ans=0;
for(int i=0;i<len;i++){
if(str[i]>='a'&&str[i]<='z'){
sh[ans++]=str[i];
flag=false;
}
else{//( ) .的情况
if(flag){//前面全是( ).没有字母
continue;
}
///前面有字母了
sh[ans]=0;
strcpy(ch[num],sh);
num++;
ans=0;
flag=true;//已经存了
}
}
if(!flag){//flag=false还有剩余,再存一下
sh[ans]=0;
strcpy(ch[num],sh);
num++;
}
printf("%d\n",num);//节点数
for(int i=0;i<num;i++){
printf("%s\n",ch[i]);
}
int k=1;
stack<int>s;
for(int i=0;i<len;i++){//模拟栈
if(str[i]=='('){
continue;
}
if(str[i]>='a'&&str[i]<='z'&&((i+1)>=len||str[i+1]<'a'||str[i+1]>'z')){
/// 进栈
if(s.size()>0){
printf("%d %d\n",s.top(),k);
}
s.push(k++);
}
if(str[i]==','||str[i]==')'){//出栈
printf("%d ",s.top());
s.pop();
printf("%d\n",s.top());
}
}
puts("");
}
}