您的位置:首页 > 大数据 > 人工智能

POJ 1363 Rails(栈)

2013-09-25 13:17 260 查看
思路:将出车站的顺序存入数组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=1010;
int stacks[maxn];  //数组模拟栈
int train[maxn];   //存储读入的火车出站顺序
int tail,length;   //栈的尾指针、长度
int main() {
int n;
while(scanf("%d",&n)!=EOF) {
if(n==0)
break;
while(scanf("%d",&train[1])!=EOF) {
if(train[1]==0)
break;
tail=0;
length=0;
int p=1;
for(int i=2; i<=n; i++)
scanf("%d",&train[i]);
int flag=1;
for(int i=1; i<=n; i++) {
int mark=0; //若mark=1,表明train[i]可以按给的顺序出战
//先比较与栈顶元素是否相同
if(length>0 && train[i]==stacks[tail-1]) {
mark=1;
tail--;
length--;
}
//接着和未进入栈的元素比较
else {
while(p<=n) {
if(train[i]!=p) {
stacks[tail]=p;
tail++;
p++;
length++;
} else {
mark=1;
p++;
break;
}
}
}
//若mark=0,表示train[i]即不与栈顶元素相同,也不与未进入栈的元素相同,即不合法,为No。
if(!mark) {
flag=0;
break;
}
}
if(flag)
printf("Yes\n");
else
printf("No\n");
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: