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