火车站(stack)

题目描述

火车站只有一条铁路,所有的火车都停在那里。所以所有的火车都是从一边进站,从另一边出站。如果A列先进入铁路,然后B列在A列离开之前进入铁路,那么A列在B列离开之前不能离开。下图说明了问题所在。车站里最多有9列火车,所有的火车都有一个ID(编号从1到N),火车按照O1的顺序进入火车,火车是否可以按照O2的顺序驶出。

输入

输入包含几个测试用例。

每个测试用例由一个整数(列车数)和两个字符串组成。两个字符串分别为列车入站顺序和列车出站顺序。

输出

如果不能按照指定顺序出站,输出“No”。

如果可以,输出“Yes”,然后输出出入站顺序(对于进入铁路的列车,应输出“in”,对于出铁路的列车,应输出“out”)。在每个测试用例之后打印一行包含“FINISH”。

输入样例1

3
3 123 321 
3 abc cab
3 123 123

 

输出样例1

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

#include<iostream>
#include<stack>
#include<vector>//类似于数组,比数组好的是,不需要初始化
#include<cstring>
using namespace std;

int main() {
	int t;
	int len;
	string inword,outword;//进来的和出去的字符
	cin >> t;
	while (t--) {
		cin >> len >> inword >> outword;
		stack<char>s;
		vector<string>show;//显示输出样例in out,也可以选择用stack,但是要正序输出,需要两个堆栈,所以考虑用vector
		int p1 = 0, p2 = 0;//标志位,遍历in和out的word
		while (p2 != len) {//只要p2没有遍历到长度,就是没有完全出完
			while (p1 < len && inword[p1] != outword[p2]) {//没有完全入完,并且进来的和出去的顺序不一致,就只能进入
				s.push(inword[p1++]);//把当前位加入s里面
				show.push_back("in");//并告知容器,此时为进入
			}
			if (p1 == len) {//走到了len,说明p1+++++到了len,竟然不是因为in=out跳出的循环,说明没救了!不可能相等。
				break;
			}
			if (inword[p1] == outword[p2]) {//刚进来就能出去,跳出上面一个while;一般情况下都能走到这一步。
				p1++;
				p2++;//比较他们的下一位
				show.push_back("in");
				show.push_back("out");//说明他们来过且出去了
			}
			while (!s.empty() && s.top() == outword[p2]) {//当栈里面还有火车,并且栈顶就是目标要出去的
				show.push_back("out");//让他出去
				s.pop();//栈指向下一位
				p2++;//p2也指向下一个
			}
		}
		if (s.empty() && p2 == len) {//栈内的火车都出去了,并且走到了最后一个要出栈的位置
			cout << "Yes" << endl;//说明此时出栈成功
			for (int i = 0; i < show.size(); i++) {
				cout << show[i] << endl;//输出in,out
			}
		}
		else {
			cout << "No" << endl;
		}
		cout << "FINISH" << endl;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值