2、铁轨 (栈)

铁路的调度站如下:

火车编号为:1~n,且不重复。

如:编号分别为“1”、“2”、“3”、“4”、“5”的5个火车顺序进站,那么进站序列为“12345”,全部进站后再顺序出站,则出站序列为“54321”,如果先进1,2,然后2出站,然后1出站,然后再3进站、出站,4进站、出站,5进站、出站,那么出站序列就为21345.

输入:

5

5 4 3 2 1

5

5 4 1 2 3

输出:

yes

no

code

#include<iostream>
#include<stack>
using namespace std;
const int MAXN = 1010;
int n;
int target[MAXN];

int main() {
	while (scanf_s("%d", &n) == 1) {
		stack<int> s;
		bool flag = 1;
		int pA = 1;
		int pB = 1;
		for (int i = 1; i <= n; i++) {
			scanf_s("%d", &target[i]);
		}
		while (pB <= n) {
			if (pA == target[pB]) {         // 优化,一进一出的情况
				pA++;
				pB++;
			}else if (!s.empty() && s.top() == target[pB]) {   // 栈非空且栈顶元素在B中顺序刚好
				s.pop();
				pB++;
			}else if (pA <= n) {         // 栈为空或栈顶元素顺序不对
				s.push(pA);
				pA++;
			}else{							//全部入栈顺序还是不对
				flag = 0;
				break;
			}
		}
		printf("%s\n", flag ? "yes" : "no");
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值