分析:
/*
思路:
用s数组存储字符串;
用光标指定元素位置,下一个元素插入时在光标位置后面;
用next数组记录指向的下一个元素,在数组上构建链表关系;
将光标在字符串中移动,模拟输出结果构建链表关系,最后根据链表将数据输出。
注意:链表一般有个头节点,可以将s[0]空出来对应头节点。
*/
代码:
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <stack>
#include <queue>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <vector>
#include <bitset>
#include <list>
#include <sstream>
#include <set>
#include <functional>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn = 1e5+5;
char s[maxn];
int Next[maxn];
int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
while(scanf("%s",s+1) != EOF) {
int cur = 0,last = 0;
Next[0] = -1;//尾节点的next默认值,可以写成-1,0,指针的话用的是null
int n = strlen(s+1);
for (int i = 1; i <= n; ++i){
if(s[i] == '[') cur = 0;
else if(s[i] == ']') cur = last;
else{//根据光标位置插入元素
Next[i] = Next[cur];//插入时元素连接光标元素后的链接
Next[cur] = i;//光标元素连接插入元素
if(cur == last) last = i;//正常插入时cur,last相等,插入后右移
cur = i;//光标右移,更新位置
}
}
for (int i = Next[0]; i != -1; i = Next[i]) printf("%c",s[i]);
printf("\n");
}
}
参考:算法竞赛入门经典(刘大爷)第六章
ps:刘大爷的代码真简洁,果然你大爷还是你大爷。