解题思路:
其实这道题的想法很简单,就是把栈当作火车轨道,用程序模拟整个火车进站出站的过程。
一开始我做的特别复杂,各种讨论,各种情况。
后来发现其实不用想的很复杂,因为栈只能出栈或者入栈,只需要分清楚什么时候入栈、什么时候出栈、什么时候结束、怎么判断情况是否存在就可以了。
一开始栈为空的时候,只能将数压进去。
如果栈不为空且栈顶元素是要输出的元素,则出栈。
否则就一直按顺序入栈。
当需要入栈和需要出栈的数全部处理完,则结束。
当所有需要入栈的元素全部入栈,却还不开始出栈,则情况不存在。
只要把这些想明白,其实这道题还是很简单的,根本不用讨论那么多种情况。
#include<stdio.h>
#include<stack>
using namespace std;
int main()
{
int n,cnt,i,j,flag,in[50],out[50],s[100];
char temp;
while(scanf("%d",&n)!=EOF)
{
stack <int> rail;
getchar();
for(i=1;i<=n;i++)
{
scanf("%c",&temp);
in[i]=temp-'0';
}
getchar();
for(i=1;i<=n;i++)
{
scanf("%c",&temp);
out[i]=temp-'0';
}
flag=1;
cnt=0;
i=1;
j=1;
rail.push(in[i++]);
//第一步一定是让第一个数入栈,其他数入栈不符合顺序,也不可能在栈为空的情况下pop
s[cnt++]=1;
//记录第一个In
while(i<=n||j<=n)
//当需要入栈的数没有入完或需要出栈的数没有出完时
//只有两种情况,入栈和出栈
{
if(rail.empty()==false&&rail.top()==out[j])
//如果栈不为空且栈顶是下一个要输出的数则出栈
{
rail.pop();
s[cnt++]=0;
j++;
}
else
//否则,按顺序将下一个数入栈
{
if(i==n+1)
{
flag=0;
break;
}
//如果已经没有可以入栈的数却依然需要入栈则证明不存在这种情况
rail.push(in[i]);
i++;
s[cnt++]=1;
}
}
if(flag==0)
{
printf("No.\n");
printf("FINISH\n");
}
else
{
printf("Yes.\n");
for(i=0;i<cnt;i++)
{
if(s[i]==1)
{
printf("in\n");
}
else
{
printf("out\n");
}
}
printf("FINISH\n");
}
}
}