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;
}
原文地址:https://www.cnblogs.com/JinxiSui/p/9740658.html