1. 程式人生 > >Uva 514 Rails(簡單棧)

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
*/