题目理解的一个要点是进站并不是一次性进完的,否则就太简单了。可以进一部分,出一部分,再进一部分。。。直到满足出站顺序要求。
理解了题目后即可得知,是一个模拟栈的问题,则关键思路是每次push之后,检查top是否符合当前index指向 的out序列中的值,若相等则pop,否则继续push(每一步都要注意修改对应index)。
附代码:
#include <iostream>
#include <stack>
using namespace std;
int main(){
int num,indexin,indexout,indexflag;
char in[100],out[100];
int f[100];
stack<char> s;
while(cin>>num>>in>>out){
while(!s.empty())
s.pop();
memset(f,-1,sizeof(f));
indexin = 0;
indexout = 0;
indexflag = 0;
while(indexin<num){
s.push(in[indexin]);
f[indexflag]=0;
indexflag++;
while(!s.empty()&&s.top()==out[indexout]){
s.pop();
f[indexflag]=1;
indexflag++;
indexout++;
}
indexin++;
}
if(indexout!=indexin){
cout<<"No."<<endl;
}
else{
cout<<"Yes."<<endl;
for(int i=0;i<sizeof(f);i++){
if(f[i]==0)
cout<<"in"<<endl;
else if(f[i]==1){
cout<<"out"<<endl;
}
else
break;
}
}
cout<<"FINISH"<<endl;
}
return 0;
}