Uva 514 Rails(简单栈)

原题链接

/*
Note:
	题意:
		有n节车厢(编号1~n),从A站驶入,经过中转站C能不能按照所给顺序target驶出中转站
		一开始输入n代表n节车厢,然后输入出站顺序target[],如果能按出站顺序出站则输出Yes,否则No
	0代表着处理n节车厢结束,然后重新输入n,如果n=0,结束program 
*/
#include<cstdio>
#include<stack>
using namespace std;
const int Max = 1010;

int target[Max],n;
stack<int> s;

bool OK(){	
	while(!s.empty())				//初始化栈 	
		s.pop();

	int k=1,p=1;					//k控制A站进入C的车厢,p控制C站出去的车厢
	while(k<=n && p<=n){
		if(k==target[p])
			k++, p++;
		else if(!s.empty() && s.top()==target[p]){
			s.pop();
			p++;
		}
		else{
			s.push(k);
			k++;
		}
	}
	while(!s.empty() && p<=n){
		if(s.top()==target[p]){
			s.pop();
			p++;
		}
		else
			break;
	}
	if(p==n+1)					//如果全部能按target[]出站返回true  
		return true;
	else
		return false;
	
}
int main(){
	bool flag;
	while(scanf("%d",&n)!=EOF && n){
		flag=true;
		while(true){
			for(int i=1;i<=n;i++){
				scanf("%d",&target[i]);
				if(!target[i]){		//如果target[]为0则可以重新输出n 
					flag=false;
					break;
				}
			}
			if(!flag)	break;
			printf("%s\n",OK()?"Yes":"No");
		}
		printf("\n");				//每次处理完n需要输出一个空行  
	}
}
/*
5
1 2 3 4 5
5 4 1 2 3
0
6
6 5 4 3 2 1
0
0
*/




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值