POJ 1363 Rails(栈)

时间:2024-01-16 18:28:02

思路:将出车站的顺序存入数组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 ;
}