样例
Sample Input
This_is_a_[Beiju]_text
[[]][][]Happy_Birthday_to_Tsinghua_University
Sample Output
BeijuThis_is_a__text
Happy_Birthday_to_Tsinghua_University
/*
题意分析:将[]中的内容整体移动最左边
1.考虑用数组。显然不行,遇到[]中的内容需要大量移动元素。考虑极端情况
[]中的内容全部在最右边,所以需要一直移动。
2.于是此题的特点就是在数组中间大量的添加操作。于是想到了使用链表。
此处用静态链表。
3.其实静态链表就是模拟动态链表。
一般需要的变量:cur,last,nex[]
4.变量解释。cur表示动态链表的最后一个节点。节点空用0表示。
nex[cur]表示cur的下一个指针指向,cur表示当前节点下标(相当于动态链表的第i个节点,i=1.2.。。n)
nex[0]相当于头结点,只存第一个节点的指针。
last只是在本题中需要。代码中说明。
5.于是变量初始化。cur=0, nex[cur]=0.cur=0表示最开始没有节点
nex[cur]=0表示头结点指向null
6.于是插入节点有两种插法,假设插入i节点。i节点的指针指向为nex[i]
一是是尾节点进行插入i。本来是nex[cur]
插入代码:nex[i] = nex[cur], nex[cur] = i;
二是,在头结点之后插入节点i,
插入代码:nex[i] = nex[cur], nex[cur] = i;
其实 代码是一样的。之后要让cur = i;指针后移。
其实会动态链表,这个很好理解。
代码如下:
*/
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int nex[maxn];
int cur,last;
char ch[maxn];
int main() {
while(scanf("%s", ch+1)==1){
int len = strlen(ch+1);
cur = 0, last = 0, nex[0] = 0;
for(int i=1; i<=len; i++){
if(ch[i] == '[') cur = 0;
else if(ch[i] == ']') cur = last;
else{
nex[i] = nex[cur];
nex[cur] = i;
if(cur == last) last = i;
cur = i;
}
}
for(int i=nex[0]; i!=0; i=nex[i])
cout << ch[i];
cout << endl;
}
return 0;
}