数据结构-栈-铁轨问题

题目描述:
某城市有一个火车站,铁轨铺设如图所示。

有n节车厢从A方向驶入车站,按进站顺序编号1~n。
现让这些火车按照某种特定的顺序进入B方向的铁轨并驶出车站。
为了重组车厢,可以借助中转站C。
C是一个可以停放任意多节车厢的车站,但由于末端封顶,驶入C的车厢必须按照相反的顺序驶出C。
对于每个车厢,一旦从A移入C,就不能再回到A了;一旦从C移入B,就不能回到C了。
换句话说,在任意时刻,只有两种选择:A→C和C→B。
请编程判断判断:按给定的出站顺序,火车能否出站。
样例输入:
5
1 2 3 4 5
5
5 4 1 2 3
6
6 5 4 3 2 1
样例输出:
Yes
No
Yes

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

int main(){
    
    
	//n:火车车厢数
	//target:用于存放输入的车厢顺序 
	int n, target[1000];
	while(scanf("%d",&n) == 1){
    
    
		stack<int> s;
		//A为原始队列的活动下标,B为target的活动下标 
		int A = 1, B = 1;
		for(int i = 1;i <= n;i ++){
    
    
			scanf("%d",&target[i]);
		} 
		bool ok = true;
		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 = false;
				break;
			}
		}
		printf("%s\n",ok?"Yes":"No");
	}
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/weixin_45867397/article/details/107348608