题意:输入一串文本,遇到[]就将里面的内容就放到最前面
然后 有两种做法,第一种,用链表来做(用数组模拟)
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
const int maxn= 100006;
char s[maxn];
int next1[maxn];
int main()
{
while(scanf("%s",s+1)!=EOF)
{
memset(next1,0,sizeof(next1));//next数组中放的是右边的下标
int len = strlen (s+1);
int cur=0,last=0;
for(int i=1;i<=len;i++)
{
if(s[i]=='[') cur=0;//放到最前面
else if(s[i]==']') cur=last;//回归正常
else
{
next1[i]=next1[cur];//先i的右边等于 cur的右边
next1[cur]=i;//cur 等于 i (相当于将cur与之前的联系去掉了)
if(last==cur) last=i;//紧跟
cur=i;
}
}
for(int i=next1[0];i;i=next1[i])
printf("%c",s[i]);
printf("\n");
}
return 0;
}
第二种用递归来
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
string str;
void dfs(int l,int r)
{
int slen=r;
while(slen>=l&&str[slen]!='['&&str[slen]!=']') slen--;//从后往前扫,因为最后的[]在最前面,也就是最先输出
if(str[slen]==']') dfs(l,slen-1);
for(int i=slen+1;i<=r;i++)
printf("%c",str[i]);
if(str[slen]=='[') dfs(l,slen-1);
}
int main()
{
while(getline(cin,str)){
// cout<<str<<endl;
dfs(0,str.length()-1);
printf("\n");
}
return 0;
}