UVa514 Rails(铁轨)
题目:铁轨
题目链接: UVa514链接
题目描述:
某城市有一个火车站,有n节车厢从A方向驶入车站,按进站的顺序编号为1-n.你的任务是判断是否能让它们按照某种特定的顺序进入B方向的铁轨并驶入车站。例如,出栈顺序(5 4 1 2 3)是不可能的,但是(5 4 3 2 1)是可能的。
题目分析:
为了重组车厢,借助中转站,对于每个车厢,一旦从A移入C就不能回到A了,一旦从C移入B,就不能回到C了,意思就是A->C和C->B。而且在中转站C中,车厢符合后进先出的原则。故这里可以看做为一个栈。
【代码】
1 #include<cstdio> 2 #include<stack> 3 using namespace std; 4 const int N = 1005; 5 int n, tar[N], A, B; 6 int main() 7 { 8 while (scanf ("%d", &n), n) 9 { 10 while (scanf ("%d", &tar[1]), tar[1]) 11 { 12 for (int i = 2; i <= n; ++i) 13 scanf ("%d", &tar[i]); 14 stack<int> sta; 15 A = B = 1; 16 bool ok = true; 17 while (B <= n) 18 { 19 if (A == tar[B]) 20 { ++A; ++B; } 21 else if (!sta.empty() && sta.top() == tar[B]) 22 { sta.pop(); ++B; } 23 else if (A <= n) 24 sta.push (A++); 25 else 26 { ok = false; break; } 27 } 28 printf (ok ? "Yes " : "No "); 29 } 30 printf(" "); 31 } 32 return 0; 33 }
【分析】
A代表A中当前待进站的第一辆火车
tar[B]代表出战序列中当前应该出站的火车
栈sta代表火车站(栈)
判断条件:
1.当A == tar[B]时,A进站马上出站,即表示当前序列可以实现
2.栈顶(车站中的末尾火车)与输入的出站序列比较,若相同,出站,并继续向下比较
3.以上若不成立,则将当前A压入栈中
4.出站序列不存在,即A > n,车站中仍有火车,说明输入的出站序列无法实现
【总结】
bool emply() 判断栈是否为空
void push() 将新元素压入栈中
void pop() 用于栈不为空时,弹出栈顶元素
void top() 用于取栈顶元素(但不删除)
STL的栈定义在头文件<stack>中,可以用“stack<int> s”声明