UVa

来源:互联网 发布:什么是seo是什么 编辑:程序博客网 时间:2024/05/29 12:53

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 + 10int 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\n",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\n",A.size());                //printf("B.size = %d\n",B.size());                //printf("C.size = %d\n",C.size());            }            //puts("out");            //printf("%d\n",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;}
原创粉丝点击