タイトル説明
配列を使用してリンクリストをシミュレートし、各文字の次の値を格納して、次の要素の添え字を示します
文字[の場合、現在の添え字を0に変更します
文字の場合]、現在の添え字を最後に変更すると、最後に保存した添え字になります
他のキャラクターについては、次に更新するだけです
#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ソリューション
使用リスト
#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;
}
}