题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1022
题目大意:有若干列火车按一定顺序进站,再按一定顺序出站,这个过程遵循“先进后出”的原则,因此这个车站其实就是一个栈的数据结构,要求给出一个进站的序列和一个出站的序列,如果按照给定的进站顺序可以得到给定的出站顺序,则输出“Yes.”。并按顺序输出每一列列车进出的顺序,若不能得到则输出“No.”
解题思路:用一个栈来模拟这个站台,在处理的过程中主要要完成两件事情,第一是模拟进站和出站的过程,判断最终能否得到给定的出站序列,第二是要记录下全部列车的进出顺序。
AC代码:
#include <iostream>
#include <stack>
using namespace std;
int main()
{
int n;
char in[100];
char out[100];
int flag[100]; //记录判断进站还是出站的标志
while(cin>>n)
{
cin>>in;
cin>>out;
stack<char> s;//模拟站台的栈
int i=0; //i代表进站序列的对应列车
int j=0; //j代表出站序列的对应列车
for(i;i<=n;)
{
if(s.empty()) //如果栈为空则处理第一个数据
{
s.push(in[i]);
flag[i+j] = 0;
i++; //第一个数据入栈,计数器加一
}
if(!s.empty()&&s.top()!=out[j])//如果栈不空并且不等于当前出站序列中的数字,则必须再将后面的标号入栈
{
s.push(in[i]);
flag[i+j] = 0;
i++;
}
if(!s.empty()&&s.top()==out[j])
{
s.pop();
flag[i+j] = 1;
j++;
} //如果栈不为空,并且栈顶元素等于当前出站序列中的当前位置,则出栈,并让出站序列向后,开始处理下一个出站序列
}
if(s.empty()) //若栈为空,证明全部列车都已经出站,所以题目给出的出站序列有可能实现
{
cout<<"Yes."<<endl;
for(i=0;i<2*n;i++)
{
if(flag[i]!=1)cout<<"in"<<endl;
else cout<<"out"<<endl;
}
cout<<"FINISH"<<endl;
}
else //若栈不为空,说明有列车滞留在车站中,肯定不能实现题目给出的出站序列
{
cout<<"No."<<endl;
cout<<"FINISH"<<endl;
}
}
return 0;
}