思路:将出车站的顺序存入数组train,由于入车站的顺序是固定的,为1~N,所以用P表示进站的车,初始为1。
接下来举例说明吧:
原来入站顺序: 1 2 3 4 5
读入的出战顺序: 3 4 2 5 1
按照train数组的顺序来执行,
1.一开始p=1,i=1:
p与train[i]=3不相等,将p(1)入栈,p++;再比较不相等,将p(2)入栈,p++;
p=train[3],则i++,p++;
2.i=2:
先比较train[i]与栈顶元素2是否相同,不相同,则与p比较。
train[i]=4与p(4)相等,i++,p++(5);
3.i=3:
先比较train[i]=2与栈顶元素2是否相同,相同,那么2出栈,i++;
4.i=4:
先比较train[i]=5与栈顶元素1是否相同,不同,则与p(5)比较,相同,则i++,p++;
5.i=5:
先比较train[i]=1是否与栈顶元素相同,相同,i++,p++。
执行结束。
途中如果遇到某一元素train[i]与栈顶元素不相同,且与之后所有未入栈的元素不相等,说明不能按此顺序出车站,即为No。
#include <iostream>
#include <stdio.h> using namespace std;
const int maxn=;
int stacks[maxn]; //数组模拟栈
int train[maxn]; //存储读入的火车出站顺序
int tail,length; //栈的尾指针、长度
int main() {
int n;
while(scanf("%d",&n)!=EOF) {
if(n==)
break;
while(scanf("%d",&train[])!=EOF) {
if(train[]==)
break;
tail=;
length=;
int p=;
for(int i=; i<=n; i++)
scanf("%d",&train[i]);
int flag=;
for(int i=; i<=n; i++) {
int mark=; //若mark=1,表明train[i]可以按给的顺序出战
//先比较与栈顶元素是否相同
if(length> && train[i]==stacks[tail-]) {
mark=;
tail--;
length--;
}
//接着和未进入栈的元素比较
else {
while(p<=n) {
if(train[i]!=p) {
stacks[tail]=p;
tail++;
p++;
length++;
} else {
mark=;
p++;
break;
}
}
}
//若mark=0,表示train[i]即不与栈顶元素相同,也不与未进入栈的元素相同,即不合法,为No。
if(!mark) {
flag=;
break;
}
}
if(flag)
printf("Yes\n");
else
printf("No\n");
}
printf("\n");
}
return ;
}