UVa514栈(经典)

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

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

    下面是源代码。

#include
#include
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 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;
}


 


你可能感兴趣的:(数据结构)