第一种方案
按照紫书上的方案,第一种是利用数组来储存位置模拟指针。
#include<cstdio>
#include<cstring>
const int maxn = 100000 + 5;
int last, cur, next[maxn];
char s[maxn];
int main(){
while(scanf("%s",s+1)== 1){
int n = strlen(s+1);
last= cur = 0;
next[0]=0;
for(inti = 1; i <= n; i++){
char ch = s[i];
if(ch== '[') cur = 0;
else if(ch == ']') cur = last;
else{
next[i]= next[cur];
next[cur]= i;
if(cur== last) last = i;
cur= i;
}
}
for(int i = next[0]; i != 0; i = next[i])
printf("%c",s[i]);
printf("\n");
}
return 0;
}
恕我愚钝,属实有点难理解else后面的内容,所以我采取的是第二种方法。
第二种方案
使用C++的STL中的LIST来建立链表。
#include <cstdio>
#include <cstring>
#include <list>
#include <iostream>
using namespace std;
int main(){
char str[100005];
list <char> s;//存储结果的链表
while (scanf("%s",str)!=EOF){
list <char>::iterator it=s.begin();//设置一个迭代器
int n=strlen(str);
for (int i=0;i<n;i++){
char ch=str[i];
if (ch=='[') it=s.begin();//迭代器储存结果的头位置
else if(ch==']') it=s.end();//迭代器储存结果的尾位置
else{
it=s.insert(it,ch);
it++;
}
}
for (it=s.begin();it!=s.end();it++) printf("%c",*it);
s.clear();
printf("\n");
}
return 0;
}