UVa514栈(经典)

      题意:火车在A以序列进入中转站B,再离去到达C,判断能否按照给定的先后顺序到达C;由于中转站是火车先进先出,FIFO模型,很容易想到用栈来模拟B;

由A到C有两种可能方案,第一:A->C;第二:A->B->C;

    下面是源代码。

#include<cstdio>
#include<stack>
using namespace std;
const int MAXN = 1000 + 10;

int n, target[MAXN];

int main(){
	while(scanf("%d",&n) == 1 && n != 0){
	while(scanf("%d",&target[1])){
		if(target[1] == 0) {
			printf("\n");
			break;	
		}
		stack<int> s;
		int A = 1, B = 1;
		int ok = 1;
		for(int i = 2; i <= n; i++)
			scanf("%d",&target[i]);
		while(B <= n){
			if(A == target[B])  { A++; B++; }   //A->C
  			else if	(!s.empty()&&s.top() == target[B]){
				s.pop();      //B->C
				B++;
			}  else if(A <= n)   s.push(A++);//将不满足的火车入栈等待
			   else {
				ok = 0;     //该车已进入B,但是不在栈首,无法弹出
				break;
			} 
		}
		printf("%s\n", ok ? "Yes" : "No"); 
	}
	}
	return 0;
}


 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值