UVa - 514 Rails ( 栈 )
水题
数据结构 : 栈
题意
输入一个整数N表示火车的数量,且栈A内火车按顺序排列( A栈栈首是1,栈尾是N ) ; 接下来给出1 - N的排列表示希望达成的栈B内的火车顺序 , 火车只能由A → B 或者 A → C(暂存) → B . 问给出的栈B序列能否达成
思路
用三个栈 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;
}