Train Problem I

Train Problem I 栈

中文翻译题目
随着新学期的到来,伊格那丢斯火车站现在非常繁忙。很多学生想坐火车回学校(因为伊格那丢火车站的火车是世界上最快的)。但问题来了,只有一条铁路所有的火车都停在那里。所以所有的火车都是从一边进站,从另一边出站。对于这个问题,如果A列先进入铁路,然后B列在A列离开之前进入铁路,那么A列在B列离开之前不能离开。下图说明了问题所在。现在你的问题是,车站里最多有9列火车,所有的火车都有一个ID(编号从1到N),火车按照O1的顺序进入火车,你的任务是确定火车是否可以按照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.
输入 输入包含几个测试用例。每个测试用例由一个整数、列车数和两个字符串组成,列车的顺序为:o1,列车的顺序为:o2。输入被文件结尾终止。在示例输入中提供更多详细信息。

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.
输出包含一个字符串“否”。如果不能将O2交换为O1,或者应该输出一个包含“是”的行,然后输出交换顺序的方式(对于进入铁路的列车,应输出“in”,对于出铁路的列车,应输出“out”)。在每个测试用例之后打印一行包含“finish”。示例输出中的更多详细信息。

Sample Input

3 123 321
3 123 312

Sample Output

Yes.
in
in
in
out
out
out
FINISH
No.
FINISH

题目大意

意思是现在有几辆列车,每个都有编号,但是进来的路和出去的路都只有一条,轨道有一条,只能先进来的最后出去,最后进去的先出来.现在给你进入的顺序让你判断是否能想给出的顺序排列到轨道上,如果能输出Yes.然后将列车的进出轨道操作说明,进轨道就是in,出轨道就是out操作结束就输出FINISH 如果不行就直接输出No和FINISH;

题目思路

先进后出,后进先出,典型的栈问题,判断是否能符合给出的顺序就直接模拟一遍列车出入的顺序,记录每一个列车序号符合给出的顺序位置,之后输出yes或no然后再演变一次就可以了

栈操作

头文件 #include< stack >
定义栈 stack<数据类型> 栈名
栈的具体操作
栈名.size() 表示栈的长度(元素个数)
栈名.empty() 判断栈是否为空 空则返回1 不空返回 0
栈名.push(元素) 在栈的顶部插入元素
栈名.top() 返回栈顶的元素
栈名.pop() 弹出栈顶的元素

另外说明栈没有.clear()函数,所以每次用完栈,要想重新用栈就pop完所以元素,或者重新定义

代码实现

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<map>
#include<set> 
#include<string>
#include<stack>
using namespace std;
int main()
{
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		int i,j;
		string s1,s2;
		cin>>s1>>s2;
		stack<char> gd;
		for(i=0,j=0;i<s1.size();i++)
		{
			gd.push(s1[i]);
			while(!gd.empty()&&gd.top()==s2[j]) //当栈不为空 判断位置是非符合要求顺序
			{
				gd.pop();                      //目前只用于判断,用完就扔出去
				j++;                           //每符合一个就加一
			}
		}
		if(j==s2.size())                       //如果符合个数相同
		{
			cout<<"Yes."<<endl; 
		}
		else
		{
			cout<<"No."<<'\n'<<"FINISH"<<endl;
			continue;                       //直接跳回while循环,不在进行下面操作
		}
		for(i=0,j=0;i<s1.size();i++)
		{
			gd.push(s1[i]);                 //跟上面操作相同就是加了个输出
			cout<<"in"<<'\n';
			while(!gd.empty()&&gd.top()==s2[j]) 
			{
				gd.pop();
				cout<<"out"<<'\n';
				j++;
			}
		}
		cout<<"FINISH"<<endl;
	}
	return 0;
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值