您的位置:首页 > 其它

《算法竞赛入门经典》6.1.2栈和队列-铁轨

2016-04-04 20:22 260 查看
  某城市有一个火车站,铁轨铺设如下图所示。有n节车厢从A方向驶入车站,按进站顺序编号为1~n。你的任务是让它们按照某种特定的顺序进入B方向的铁轨并使出车站。为了重组车厢,你可以借助中转站C;这是一个可以停放任意多节车厢的车站,但由于末端封顶,驶入C的车厢必须按照相反的顺序驶出C。对于每个车厢,一旦从A进入C,就不能再回到A了;一旦从C进入B,就不能回到C了。换言之,在任意时刻,只有两种选择:A->C和C->B。

#include <cstdio>
#include <stack>
using namespace std;
#define MAXN 1000 + 10
int n, target[MAXN];

int main(void)
{
while(scanf("%d", &n) == 1)
{
stack<int> s;
int A = 1, B = 1;
for(int i = 1; i <= n; i++)
scanf("%d", &target[i]);
int ok = 1;
while(B <= n)
{
if(A == target[B]) { A++; B++; }    //车厢按顺序进出中转站C,则跳出循环
else if(!s.empty() && s.top() == target[B]) { s.pop(); B++; }//若车厢按逆序进中转站C,则跳出循环
else if(A <= n) s.push(A++);        //调整车厢为逆序出中转站C
else { ok = 0; break; }                //车厢既不是按顺序,也不是按逆序进出中转站C
}
printf("%s\n", ok ? "Yes" : "No");
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: