C - Train Problem I stack典例

本文深入探讨了一种基于栈数据结构的火车调度算法,用于解决伊格那丢斯火车站的火车调度问题。通过两次遍历检查火车是否能按照指定顺序进出站,并详细展示了如何通过代码实现这一过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

高端题,在下不行

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

对于第一个样本输入,我们让第1列进入,然后让第2列和第3列进入。
所以现在3号列车在铁路的顶部,所以3号列车可以先离开,然后2号列车和1号列车。
在第二个样本输入中,我们应该让3号列车先离开,所以我们必须让1号列车进入,然后让2号列车和3号列车进入。
现在我们可以让3次列车离开了。
但是在那之后,我们不能让1号列车先于2号列车离开,因为2号列车现在在铁路的顶端。
所以我们输出“no.”。
Hint
Hint

//////////////////////////////////

题目大概是这个样子的,就是说有火车,先进后出,典型的栈,用stack来做。这个题需要遍历两次,第一次是判断能否成功,第二次是输出进出顺序。

//////////////////
奉上AC代码
//////////////////////////////////////////////////////////

#include<stdio.h>
#include<iostream>
#include<stack>
#include<vector>
#include<map>
#include<string.h>
#include<set>
#include<algorithm>
#include<list>
#include<queue>
#include<string>

using namespace std;

int main()
{
	int n, i, j;
	string s1, s2;
	while (scanf("%d", &n) != EOF)
	{
		i = j = 0;
		cin >> s1 >> s2;
		stack<char>o1, o2;
		for (; i < s1.length(); i++)
		{
			o1.push(s1[i]);
			while (o1.top() == s2[j])
			{
				o1.pop();
				j++;
				if (o1.empty())
					break;
			}
		}
		if (j == s2.length())
			cout << "Yes." << endl;
		else
		{
			cout << "No.\nFINISH" << endl;
			continue;
		}
		i = j = 0;
		for (; i < s1.length(); i++)
		{
			o1.push(s1[i]);
			printf("in\n");
			while (o1.top() == s2[j])
			{
				o1.pop();
				j++;
				cout << "out" << endl;
				if (o1.empty())
					break;
			}
		}
		cout << "FINISH" << endl;
	}
	return 0;
}

/////////////////////
感悟:遇到自己不会做的题,不要慌张,因为你越慌越做不出来!!! 反正我是绝望了!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值