明显要用栈来模拟。
突破口:找栈顶
解析将在代码中体现。
#include<stack>
#include<vector>
#include<string>
#include<cstring>
#include<iostream>
using namespace std;
stack<char> p;
vector<string> v;
char s1[15],s2[15]; //s1存储入栈顺序,s2存储出栈顺序
void print()
{
string t1="in",t2="out";
int len1=strlen(s1),len2=strlen(s2);
int i=0,j=0; //设置两个游标,i为s1的游标,指向s1对应元素,j为s2游标
while(i<len1)
{
p.push(s1[i++]); //入栈
v.push_back(t1);
char c=p.top();
while(j<len2&&c==s2[j]) //判断入栈的元素是否为栈顶
{
p.pop(); //是的话,就吐出这个元素
v.push_back(t2);
j++; //游标j指向s2下一个元素
if(p.empty()) break; //如果栈已经空了,就可以结束了
else c=p.top(); //否则继续取当前的栈顶,进行下一轮判断
}
}//cout<<v.size()<<endl;
if(!p.empty()) //如果栈不为空,说明还有元素没有出栈,也就是还有火车没有出站,输出No.
cout<<"No."<<endl<<"FINISH"<<endl;
else //否则,说明火车可以按特定顺序出站
{
cout<<"Yes."<<endl;
for(vector<string>::iterator it=v.begin();it!=v.end();++it)
cout<<*it<<endl;
cout<<"FINISH"<<endl;
}
}
int main()
{
int n;
while(cin>>n>>s1>>s2)
{
print();
v.clear(); //vector还有栈都要记得清空
while(!p.empty()) p.pop();
}
return 0;
}
可以用个例子来说明一下:
4 1342 3142
初始i=0,j=0;
1、s1[0]入栈,p(1),i++,栈顶c=1,由于c!=s2[0],不进入内层循环,继续外层循环
2、s1[1]入栈,p(1,3),i++,栈顶c=3,由于c=s2[0],进入内层循坏:
p.pop() --> p(1), j++,c=1;
c=s2[j] --> p.pop(), p(), j++, 栈为空,结束。
3、s1[2]入栈,p(4),i++,栈顶c=4,由于c=s2[2],进入内层循环:
p.pop() --> p(), j++, 栈为空,结束。
4、s1[3]入栈,p(2),i++,栈顶c=1,由于c=s2[3],进入内层循环:
p.pop() --> p(), j++, 栈为空,结束。
5、i>=len1,结束
循环结束,栈p为空,说明能满足要求,按题目要求输出。