Train Problem I
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 26008 Accepted Submission(s): 9821
3 123 321 3 123 312
Yes. in in in out out out FINISH No. FINISHFor the first Sample Input, we let train 1 get in, then train 2 and train 3. So now train 3 is at the top of the railway, so train 3 can leave first, then train 2 and train 1. In the second Sample input, we should let train 3 leave first, so we have to let train 1 get in, then train 2 and train 3. Now we can let train 3 leave. But after that we can't let train 1 leave before train 2, because train 2 is at the top of the railway at the moment. So we output "No.".HintHint
分析:这道题目完全是考察对栈的理解和运用,给出一个入栈的序列和一个出栈的序列,要求判断在此入栈顺序的前提下,能否按此出栈顺序出栈,能的话输出入栈和出栈的顺序。
1、先建立一个栈,用来模拟进栈和出栈的过程。
2、先从入栈顺序中找出第一个出栈的元素,并把入栈顺序中在此元素之前的元素push进已经建立好的栈。
3、不断取栈顶元素与出栈顺序中的元素比较,一样就出栈,不一样时,继续从入栈顺序中入栈。
注:当入栈顺序中的元素全部入栈但栈顶元素仍和当前出栈顺序的元素不一样时,就表明不能实现了。
比如输入序列为1、2、3、4输出序列为3、4、2、1,这是输出序列第一个数字为3,我们就从输入序列开始寻找3,直到找到3,而假如3之前有数据我们就把它们存入栈中,在输入序列中,开始碰到的是1元素,和输出序列的第一个元素不相等,我们就把1放入栈中,然后就是2元素,也不想等,也放入栈中,然后就是3,这时候和输出序列的第一个元素相等,我们就把输出序列的下标移到2,而输入序列的下标移到3,这时候输出序列的元素为4,先个栈顶元素比较,发现不相等,这时候元素要么在输入序列的后面,要么就没有,我们在输入序列里面寻找,此时的出入序列指到元素4正好和输出序列的元素相等,于是我们把输出序列和输入序列的下标都加上1,此时输入序列已经弄完了,而输出序列指着2,我们也先和栈顶元素比较,发现它们相等,于是我们把栈顶元素删除,同时输出序列的下标加1,这时候输出序列直到元素1,我们再和栈顶元素比较,发现它们相等,于是我们把栈顶元素删除,同时输出序列的下标加1。这时候我们发现栈为空,而且输入序列的下标已经直到输入序列的末尾,这说明输出序列是栈的输出序列,我们返回true,否则我们返回false;
AC码
#include<stdio.h>
#include<string.h>
#define max 20
int main()
{ char a[max],b[max],c[max];
int k,i,j,m,n;
int flag[105];//定义的数组不能太小,要恰好比要求的大一点点
while(scanf("%d",&n)!=EOF)
{
scanf("%s%s",a,b);
k=0;
j=0;
m=0;
c[0]=a[0];
for(i=1;i<n||j<n;i++) /注意这个或的关系
{
if(c[k]==b[j])
{
k--; //注意三个变量同时改变
j++;
i--;//不能让i一直往前走,容易丢值
flag[m++]=1;//注意选取一个标志位,以便于最后按条件输出
}
else
{
k++;
c[k]=a[i];
flag[m++]=0;
}
}
if(k>=0)
printf("No.\n");
else
{
printf("Yes.\n");
printf("in\n");
for(i=0;i<m;i++)
{
if(flag[i]==0)
printf("in\n");
else
printf("out\n");
}
}
printf("FINISH\n");
}
return 0;
}
心得:
注意体会什么时候跳出循环
注意体会输出的结果是什么含义
注意体会这里的栈的知识,学会转化