分析:这个题的题意还是很好理解的,就是如果'['便返回开头,']'便到尾部之后再继续输出。惯性思维,这个题用
数组存储,之后移动数组元素,这样做的效率是非常低的,数据太大会超时。如果想插入元素的速度快,链表,插入
是O(1)(想到这里,我就中陷阱了,错误的以为,vector等同于链表,其实不尽然,vector仍然是一块连续的空间
,插入的效率和C语言里的数组类似,所以,我便跪了数次,~~~~悲伤~~~~)。用链表也有好几种方式,可以用数组模
拟一个链表,也可以用结构体定义节点,最贱的还数STL里的list。
数组模拟的代码:
#include <cstdio>
#include <cstring>
const int maxn=100005;
int wei,head,next[maxn];
char s[maxn];
int main()
{
while(scanf("%s",s+1)!=EOF)
{
int n=strlen(s+1);
head=wei=0;
next[0]=0;
#include <cstring>
const int maxn=100005;
int wei,head,next[maxn];
char s[maxn];
int main()
{
while(scanf("%s",s+1)!=EOF)
{
int n=strlen(s+1);
head=wei=0;
next[0]=0;
for (int i=1;i<=n;i++)
{
char ch=s[i];
if (ch=='[') head=0;
else if (ch==']') head=wei;
else
{
next[i]=next[head];
next[head]=i;
if (head==wei) wei=i;
head=i;
}
}
for (int i=next[0];i!=0;i=next[i])
printf("%c",s[i]);
printf("\n");
}
return 0;
}
{
char ch=s[i];
if (ch=='[') head=0;
else if (ch==']') head=wei;
else
{
next[i]=next[head];
next[head]=i;
if (head==wei) wei=i;
head=i;
}
}
for (int i=next[0];i!=0;i=next[i])
printf("%c",s[i]);
printf("\n");
}
return 0;
}
用STL写的代码:
#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;
}
#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;
}