方法:
题目中的出站与入站跟stack的操作一致,故用stack来表示车站。
初始A面的顺序是从1到N,B面的顺序由题目中给出。
A面的每个车辆,只有两个选择,一个是正好对应此时B的首辆,二是进栈。
B的首辆要么是栈的top,要么是A的首辆。
两个变量,一个是此时B的首辆,一个是此时A的首辆。
所以可以一直循环,来使B的每一辆与A的首辆或者栈的top()一一对应,循环条件是B还有剩余的车辆。
AC代码:
#include <iostream>
#include <stack>
using namespace std;
const int maxn = 1000+10;
int main()
{
int n;
while(cin>>n&&n)
{
int dl[maxn];
while(cin>>dl[0]&&dl[0])
{
for(int i=1;i<n;i++)
cin>>dl[i];
stack<int> stt;
int id = 1;
int len = 0;
int flag = 1;
while(len<n)
{
if(id==dl[len])
{
id++;
len++;
}
else if(!stt.empty()&&stt.top()==dl[len])
{
stt.pop();
len++;
}
else if(id<=n)
{
stt.push(id);
id++;
}
else
{
flag = 0;
break;
}
}
if(flag)
cout<<"Yes\n";
else
cout<<"No\n";
}
cout<<endl;
}
return 0;
}