某城市有一个火车站,铁轨铺设如图,有n节车厢从a方向驶入车站,按进站顺序编号为1~ n ,你的任务是让他们按照某种特定的顺序进入b 方向的铁轨并驶出车站。为了重组车厢,你可以借助中转站c.这是一个可以停放任意多节车厢的车站,但由于末端封顶,驶入c的车厢必须按照相反的顺序驶出c.对于每个车厢,一旦从a移入c,就不能再回到a 了:一旦从c 移入 b就不能回到c了。换句话说,在任意时刻,只有两种选择:a->c和c->b.
#include<iostream>
#include<stack>
using namespace std;
const int Maxn=100+10;
int n,target[Maxn];
int main()
{
while(cin>>n,n)
{
stack<int> s;
int a=1,b=1;
for(int i=1;i<=n;i++)
cin>>target[i];
int ok=1;
while(b<=n)
{
if(a==target[b]){a++;b++;}
else if(!s.empty()&& s.top()==target[b]){s.pop();b++;}
else if(a<=n){s.push(a++);}
else{ok=0;break;}
}
// cout<<ok<<endl;
printf("%s\n",ok? "Yes":"No");
}
return 0;
}
===========================================================================
第一个条件是 判断用的,看是否等于当前 target[b];
第二个条件 是 检查栈顶的值是否等于 当前target[b];
第三个条件 是 入栈
总的出发点思想是:模拟车厢 进站 出站的过程,通过栈来实现。