• UVa


    UVa - 514 Rails ( 栈 )

    水题
    数据结构 : 栈

    题意

    输入一个整数N表示火车的数量,且栈A内火车按顺序排列( A栈栈首是1,栈尾是N ) ; 接下来给出1 - N的排列表示希望达成的栈B内的火车顺序 , 火车只能由A → B 或者 A → C(暂存) → B . 问给出的栈B序列能否达成

    [ UVA - 514 (VJ) ]

    思路

    用三个栈 A B C 表示 铁路A 铁路B 车站C
    一个目标数组 target[] 记录希望达成的栈B内的火车顺序
    用栈C是否为空来判断是否能达成目标数组

    记录

    第一次学习数据结构对栈的一些操作还不是很熟练
    在这里记录一下栈的基本知识

    //C++中栈的头文件
    #include <stack>

    < c++栈的方法的基本用法 >
    push() : 向栈内压入一个成员;
    pop() : 从栈顶弹出一个成员;
    empty() : 如果栈为空返回true,否则返回false;
    top() : 返回栈顶,但不删除成员;
    size() : 返回栈内元素的大小 ;

    AC代码

    /*
        只有A→C/C→B两种走法
    */
    
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <stack>   //栈 后入先出
    using namespace std;
    
    #define maxn 1000 + 10
    int target[maxn];
    
    int main()
    {
        int n;
        //int nn = 0;
        while( scanf("%d",&n) && n )
        {
            stack<int> A,B,C;  //三个栈
            memset( target, 0, sizeof(target) );
            while( cin >> target[0] && target[0] )
            {
                for( int i = n ; i >= 1 ; i-- ) //顺序入栈A
                    A.push(i);
                for( int i = 1 ; i < n ; i++ ) //存入目标数列
                    cin >> target[i];
                for( int i = 0 ; i < n ; i++ )
                {
                    //printf("i=%d
    ",i);
                    if( A.empty() && C.top() != target[i] )
                    //A栈已空且B栈未满
                        break;
                    //如果C栈有元素且栈首 == 目标
                    while( !C.empty() && C.top() == target[i] ){
                        B.push(C.top());  //将C栈首推入B
                        C.pop();  //并将C栈首弹出
                        target[i] = 0;
                        i++;
                    }
                    //如果C中无元素或者C栈首 != 目标 , 从A栈首拿出火车放入C/B中
                    if( !A.empty() ){
                        if( A.top() == target[i] ){
                            B.push(A.top());
                            target[i] = 0;
                        }
                        else
                            C.push(A.top());
                        A.pop();
                    }
    
                    if( target[i] != 0 )
                        i--;
                    //printf("A.size = %d
    ",A.size());
                    //printf("B.size = %d
    ",B.size());
                    //printf("C.size = %d
    ",C.size());
                }
                //puts("out");
                //printf("%d
    ",C.size());
                if( C.empty() )
                    cout << "Yes" << endl ;
                else
                    cout << "No" << endl ;
                //清空BC栈
                while( !B.empty() )     B.pop();
                while( !C.empty() )     C.pop();
            }
            puts("");
            /*
            本来特殊处理了回车 没料到PE 
            只能最后统一输出一个回车才AC 再看题目要求
            "In addition, there is one empty line after
            the lines corresponding to one block of the
            input file."
            这里就是不需要特处理回车 每次直接回车即可
            */
        }
        return 0;
    }
    
  • 相关阅读:
    Linux学习之十九-Linux磁盘管理
    Linux学习之十八-sudo分权管理
    Linux学习之十七-配置Linux简单的脚本文件自启动
    Linux系统救援模式应用:恢复误删的系统文件
    Linux学习之十六-Linux用户管理
    Linux学习之十五-Linux文件特殊权限和附加权限
    Linux学习之十四-Linux文件和目录权限
    Linux学习之十三-vi和vim编辑器及其快捷键
    Linux学习之十二-Linux文件属性
    Linux系统救援模式应用:单用户模式找回密码
  • 原文地址:https://www.cnblogs.com/JinxiSui/p/9740658.html
Copyright © 2020-2023  润新知