杭电1022(栈)(思路和注释)

问题描述

随着新学期的到来,伊格纳修斯火车站现在非常繁忙。许多学生想乘火车回到学校(因为伊格纳修斯火车站的火车是世界上最快的V^)。但问题来了,只有一条铁路,所有的火车都停在那里。所以所有的火车都从一边进来,然后从另一边出来。对于这个问题,如果A列车先进入铁路,然后B列车在A列车离开之前进入铁路,那么A列车在B列离开之前是不能离开的。下面的图片说明了问题的所在。现在的问题是,车站最多有9列火车,所有列车都有一个ID(编号从1到n),火车按O1顺序进入铁路,你的任务是确定火车是否能按O2顺序下车。

输入

输入包含几个测试用例。每个测试用例由一个整数、列车数和两个字符串组成,火车的顺序是:O1,火车的顺序是:O2。输入将在文件结束时终止。示例输入中的更多细节。

输出量

输出包含一个字符串“No”。如果您不能将O2转换为O1,或者您应该输出一条包含“是”的线路,然后输出您在交换订单时的方式(您应该在“输入”一列进入铁路的列车中输出,而“输出”一列从铁路上出来的列车)。在每个测试用例之后打印一行包含“Finish”。示例输出中的更多细节。

样本输入

3 123 321
3 123 312

样本输出

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

思路

由题目中的图我们可以看出,这是一个入栈出栈基本的操作题
当栈内非空时,我们有两种处理方式
1.将栈顶的元素出栈
2.入栈新元素

题目中的意思并非所有车都进去后,才能有出来的权利
它完全可以边入站边出站

所以说在火车入站时我们都要判断一次看看是否能够符合出站条件
在每次出站之后我们也要判断是否还有符合条件的列车接着出站

在所有火车入站完成后,只能进行出站操作,一个个判断即可

如果能够完成操作的话,还要输出in和out的过程
这个在入站出站过程中用一个数组记录即可

代码

#include<iostream>
#include<stack>
#include<string>
using namespace std;
bool f(int a[],int n, string s1, string s2)
{
	int i = 0;
	int i1 = 0;
	int i2 = 0;
	stack<char> s;
	while (i1 < n)//入栈直到入站车全部完全进入,中间若符合条件可以出栈
	{
		s.push(s1[i1++]);
		a[i++] = 1;//in
		while (!s.empty()&&s.top() == s2[i2])//栈顶车和目标出站车一样则一直出栈
		{
			i2++;
			a[i++] = 0;//out
			s.pop();
		}
	}
	while (i2 < n)//一个个出栈验证
	{
		if (s2[i2++] != s.top())//栈顶车和目标出站车有一个不一样则不符合要求
		{
			return false;
		}
		else
		{
			a[i++] = 0;//out
			s.pop();
		}
	}
	return true;
}
int main()
{
	int n;
	while (cin >> n)
	{
		int a[10005];//储存in和out in-1 out-0
		string s1, s2;
		cin >> s1 >> s2;
		//按照要求输出即可
		if (!f(a, n, s1, s2))
		{
			cout << "No." << endl << "FINISH" << endl;
		}
		else
		{
			cout << "Yes." << endl;
			for (int i = 0; i < 2 * n; i++)
			{
				if (a[i])cout << "in" << endl;
				else cout << "out" << endl;
			}
			cout << "FINISH" << endl;
		}
	}
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值