zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    用最简单的例子理解装饰器模式(Decorator Pattern)
    用最简单的例子理解迭代器模式(Iterator Pattern)
    用最简单的例子理解观察者模式(Observer Pattern)
    用最简单的例子理解单例模式(Singleton Pattern)
    用最简单的例子理解对象为Null模式(Null Object Pattern)
    用最简单的例子理解策略模式(Strategy Pattern)
    使用Lazy<T>实现对客户订单的延迟加载
    C#关键字var是什么,在何种情况下使用
    C#中的IDisposable模式
    CLR基础,CLR运行过程,使用dos命令创建、编译、运行C#文件,查看IL代码
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/3338544.html
Copyright © 2011-2022 走看看