hdoj 1022 火车进出站问题

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


Problem Description
As the new term comes, the Ignatius Train Station is very busy nowadays. A lot of student want to get back to school by train(because the trains in the Ignatius Train Station is the fastest all over the world ^v^). But here comes a problem, there is only one railway where all the trains stop. So all the trains come in from one side and get out from the other side. For this problem, if train A gets into the railway first, and then train B gets into the railway before train A leaves, train A can't leave until train B leaves. The pictures below figure out the problem. Now the problem for you is, there are at most 9 trains in the station, all the trains has an ID(numbered from 1 to n), the trains get into the railway in an order O1, your task is to determine whether the trains can get out in an order O2.
 

Input
The input contains several test cases. Each test case consists of an integer, the number of trains, and two strings, the order of the trains come in:O1, and the order of the trains leave:O2. The input is terminated by the end of file. More details in the Sample Input.
 

Output
The output contains a string "No." if you can't exchange O2 to O1, or you should output a line contains "Yes.", and then output your way in exchanging the order(you should output "in" for a train getting into the railway, and "out" for a train getting out of the railway). Print a line contains "FINISH" after each test case. More details in the Sample Output.
 

Sample Input
  
  
3 123 321 3 123 312
 

Sample Output
  
  
Yes. in in in out out out FINISH No. FINISH
Hint
Hint
For 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.".


分析:这道题目完全是考察对栈的理解和运用,给出一个入栈的序列和一个出栈的序列,要求判断在此入栈顺序的前提下,能否按此出栈顺序出栈,能的话输出入栈和出栈的顺序。

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;
}




心得:


注意体会什么时候跳出循环

注意体会输出的结果是什么含义

注意体会这里的栈的知识,学会转化

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值