题意:字符'['表示句首,就是光标移到了句首,’】‘表示句尾
法一:用链表模拟光标移动
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const int maxn=100005;
int last,cur,next[maxn];
char s[maxn];
int main()
{
//freopen("f.txt","r",stdin);
while(scanf("%s",s+1)==1){
int n=strlen(s+1);
last=cur=0;
next[0]=0;
for(int i=1;i<=n;i++){
char ch=s[i];
if(ch=='[')cur=0;
else if(ch==']')cur=last;
else{
next[i]=next[cur];
next[cur]=i;
if(cur==last)last=i;
cur=i;
}
}
for(int i=next[0];i!=0;i=next[i]){
printf("%C",s[i]);
}
printf("\n");
}
return 0;
}
法二:这题看到有人用双端队列,把[加入队首,】加入队尾,再按照队列中的顺序输出
#include <iostream>
#include <string>
#include <vector>
#include <cstdio>
#include <deque>
using namespace std;
char str[100010];
int main(){
// freopen("f.txt","r",stdin);
while(scanf("%s",str)!=EOF){
deque<int > q;
int i=0;
while(str[i]=='['||str[i]==']') i++;
q.push_front(i);
while(str[i]){
if(str[i]=='['){
q.push_front(i+1);
str[i]='\0';
}
else if(str[i]==']'){
q.push_back(i+1);
str[i]='\0';
}
i++;
}
while(!q.empty()){
printf("%s",str+q.front());
q.pop_front();
}
printf("\n");
}
return 0;
}
法三:
分析:给出的一行文本,从后往前看,如果遇到】,那么】后面的字符串一定在最后,后面的字符串一定在最前,再往前移动还是这样的规律,所以这题可以用递归解决;
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
char buf[100001];
void dfs(int l, int r)
{
int s = r;
while (s >= l && buf[s] != '[' && buf[s] != ']') s --;
if (buf[s] == ']') dfs(l, s-1);
for (int i = s+1 ; i <= r ; ++ i)
printf("%c",buf[i]);
if (buf[s] == '[') dfs(l, s-1);
}
int main()
{
// freopen("f.txt","r",stdin);
while (gets(buf)) {
dfs(0, strlen(buf)-1);
printf("\n");
}
return 0;
}