题目

某个城市右一个火车站,铁轨铺设如图所示,有 n n n节车厢从 A A A方向驶入车站,并且按照进站顺序编号为 1 1 1~ n n n。你的任务是判断是否能让它们按照某种特定的顺序进入 B B B方向的铁轨并驶出车站。驶入车站的车厢必须按照相反的顺序输出车站,对于每个车厢而言,只能从 A − 车 站 − B A-车站-B AB
在这里插入图片描述

思路

我们可以用 A A A表示此时驶入车站的车厢的编号, t a r g e t [ B ] target[B] target[B]表示当前判断到的驶出车站的第 B B B个车厢的编号。用 s t a c k < i n t > S stack<int> S stack<int>S表示车站中的车厢顺序。
接下来只有三种情况
开始判断后,若发现A中的车等于B中的车,则说明了,这辆车进站后立即出站。
若发现B中的车等于栈S中的第一个,那么说明此时,栈S的中的车要出站。
若发现A中还有剩余,则让A进站。
若以上操作都无法实现,就代表没办法输出B中顺序的车厢。

具体代码

#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;

const int MAXN=1000+10;

int n,target[MAXN];

int main()
{
	while(scanf("%d",&n)==1)//多组输入
	{
		stack<int> s;
		int A=1,B=1;
		for(int i=1;i<=n;i++)
		{
			cin>>target[i];//读入B中的序列
		}
		int ok=1;
		while(B<=n)
		{
			if(A==target[B]{A++,B++;}
			else if(!s.empty()&&s.top()==target[B]){s.pop();B++;}
			else if(A<=n) s.push(A++);
			else {ok=0;break;}
		}
		cout<<ok?"Yes":"No";
	}
	return 0;
}
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐