题目描述
用数组模拟链表,对于每一个字符存一个next值表示下一个元素的下标
对于字符[,将当前下标改为0
对于字符],将当前下标改为last就是我们存的最后的下标
对于其他字符,更新next即可
#include <bits/stdc++.h>
using namespace std;
char s[100005];
int last,now,nxt[100005];
int main(){
while(~scanf("%s",s+1)){
int n=strlen(s+1);
last=0;
now=0;
nxt[0]=0;
for(int i=1;i<=n;i++){
char ch=s[i];
if(ch=='[')now=0;
else if(ch==']')now=last;
else{
nxt[i]=nxt[now];
nxt[now]=i;
if(now==last)last=i;
now=i;
}
}
for(int i=nxt[0];i!=0;i=nxt[i])printf("%c",s[i]);
printf("\n");
}
return 0;
}
STL解法
使用list
#include<cstdio>
#include<list>
#include<iostream>
#include<string>
void solve(std::string s){
std::list<char> text;
std::list<char>::iterator it = text.begin();
//判断每一位
for(int i = 0;i < s.length();i++){
char c = s[i];
if(c == '['){
//如果是Home键
it = text.begin();//就把迭代器指向开头,就是Home键的功能啦Da Da
}else if(c == ']'){
//如果是End键
it = text.end();//就把迭代器指向末尾,就是End键的功能
}else{
//并在不会把“[”和“]”输入到list里面去,仔细想想为啥咯
it = text.insert(it,c);
it++;//然后指向下一位
}
}
for(it = text.begin();it != text.end();it++){
std::cout << *it;
}
s.clear();
std::cout << std::endl;//记得换行
}
int main(){
std::string s;
while(std::cin >> s){
solve(s);
}
return 0;
}
使用deque
#include<deque>
#include<cstring>
#include<iostream>
using namespace std;
deque<string> dq;
string s,temp;
int main(){
while(cin>>s){
char op=0;
temp.clear();
for(int i=0;i<s.size();i++){
if(s[i]=='['||s[i]==']'){
if(op=='[')
dq.push_front(temp);
else
dq.push_back(temp);
temp.clear();
op=s[i];
}
else{
temp+=s[i];
}
if(i==s.size()-1){
if(op=='[')
dq.push_front(temp);
else
dq.push_back(temp);
temp.clear();
}
}
while(!dq.empty()){
cout<<dq.front();
dq.pop_front();
}
cout<<endl;
}
}