POJ 1363 Rails(栈)

思路:将出车站的顺序存入数组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
");
            else
                printf("No
");
        }
        printf("
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/chenxiwenruo/p/3338544.html