杭电 1022【火车的出栈入栈】

本文介绍了一种解决火车进出站调度问题的算法实现,通过使用栈来模拟火车进出站的过程,判断给定的进出站顺序是否可行,并提供具体的进出站步骤。

Train Problem I

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.".
  
/*
*火车的出栈入栈问题
*
*注意测试用例给的不完整,可能出现进出次数大于进出车数的情况即in.in.out.out.in.out类似的情况。
*
*输入进出次数  进站顺序 出栈顺序
*
3 123 321
3 123 312
*
Yes.
in
in
in
out
out
out
FINISH
No.
FINISH


*/
#include<iostream>
//用到栈时所必须声明的头文件
#include<stack>    
using namespace std;
int main()
{
	//定义一个栈s
	stack<char> s;
	//因为题目给定总共不超过9个车入站,所以进站数组in,出站数组out定值为10
	char in[10],out[10],flag[20];
	//n中存放进站的数量,flag数组中负责记录进站出站的情况,i,j,k为方便运算的变量
	int n,i,k,j;
	//通过while循环,循环进行出站入站处理
	while(cin>>n>>in>>out)
	{
		//每一次运算之前,负责k作为flag记录中会用到的变量,j作为已出站的火车数量的记录,都需清零处理
		k=0;j=0;
		//如果运算之前栈内不为空,则持续出栈处理,直到栈清空
		while(!s.empty())
		{
			s.pop();
		}
		//通过n以内的for循环对火车出站入站进行处理
		for(i=0;i<n;i++)
		{
			//将进站数组in中的值按顺序入栈
			s.push(in[i]);
			//入栈处标记为1,k自增以便记录下一个状态
			flag[k++]='1';
			//如果栈不为空,并且此时栈顶的车次与目前出站次序的车次相符,则出站即出栈处理,直到栈内的车次不符合出站车次,或栈已空
			while(!s.empty()&&s.top()==out[j])
			{
				//出站即出栈处理
				s.pop();
				//出栈处标记为0,k自增以便记录下一个状态
				flag[k++]='0';j++;
			}
		}
		//如果可以出站的车数与入站的车数相符,则认为这样的入站出站安排是可行的
		if(j==n)
		{
			//按照格式要求输出'YES.'
			cout<<"Yes."<<endl;
			//因为k在flag记录后会自增1,所以for循环时i应该小于k,通过for循环对flag中记录的出站入站进行输出
			for(i=0;i<k;i++)
			{
				if(flag[i]=='1')
				{
					cout<<"in"<<endl;
				}
				if(flag[i]=='0')
				{
					cout<<"out"<<endl;
				}
			}
		}
		//如果可以出站的车数与入站车数不相符,则说明这样的入站出站安排是不可行的,则按要求输出'NO.'
		else{cout<<"No."<<endl;}
		//最后按格式要求输出FINISH
		cout<<"FINISH"<<endl;
	}
	return 0;
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值