POJ 1363 Rails 模拟栈

该博客介绍了如何使用模拟栈解决POJ 1363题目的火车车厢出站顺序问题。题目要求判断给定的出站顺序是否可能。解题思路是按照先进后出的原则进行栈操作,并处理特殊情况如车厢交错进出。代码实现给出了具体的解决方案。
摘要由CSDN通过智能技术生成

来源:http://poj.org/problem?id=1363

题意:有一列火车,车厢编号为1到n,只能由一段进站,另一端出站。现在进站顺序确定,给出一个出站的顺序,判断出站顺序是否可能。

思路:其实就是一个模拟栈的过程,先进后出。但是由于会出现这样的情况,比如说:1 2 3进栈,然后3出栈,然后4 5进栈,所以该出栈的顺序是3 5 4 2 1,所以在模拟的过程中需要注意一下。

还有就是注意一下最后输入0的时候没有换行,所以需要特殊处理一下。

代码:

#include <iostream>
#include <cstdio>
#include <string.h>
#include <stack>
using namespace std;

#define CLR(arr,val) memset(arr,val,sizeof(arr))
const int N = 1010;
int num[N];
int main(){
	//freopen("1.txt","r",stdin);
	int n;
	bool isfun = false;
	while(scanf("%d",&n)){
	  if(n == 0)
		  break;
	  else if(n != 0 && isfun)
		  printf("\n");
	  isfun = true;
	  int x;
	  while(scanf("%d",&x)&&x){
	    num[0] = x;
		for(int i = 1; i < n; ++i)
			scanf("%d",&num[i]);
		stack<int> ss;
		bool isok = true,flag[N];
		CLR(flag,false);
		int cnt = 0;
		for(int i = 0; i < n;){
			if(flag[num[i]]){
				i++;
				continue;
			}
		  int y = num[i];
		  for(int j = 1; j <= y; ++j){
		    if(flag[j])continue;
			ss.push(j);
			flag[j] = true;
			cnt++;
		  }
		  while(!ss.empty()){
			  if(ss.top() != num[i]){
				break;
			  }
			  else{
			    i++;
				ss.pop();
			  }
		  }
		}
        if(!ss.empty()) isok = false;
		if(!isok)
			printf("No\n");
		else
			printf("Yes\n");
	  }
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值