来源: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;
}