题型:模拟
题意:火车车厢以1~n的顺序开进车站,有一个铁轨用于暂时停放车厢,问是否可以按输入的火车顺序开出。
分析:用栈模拟即可。
1、 先用循环将当前车厢编号放入栈中,若遇到符合驶出序号的则弹出top。
2、 然后再将stack再查一遍,有符合的就pop。
3、 最后剩在stack里的元素只能按部就班的乖乖进行比较了,有就pop,木有就break;
注意点:
1、 注意每次开始执行新的数据之前需注意将队列清空。
2、 若有符合的在pop完之后一定要将stack再查一遍。
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<stack>
using namespace std;
int a[123456],b[123456];
int main()
{
int n;
stack<int> s;
while(scanf("%d",&n)&&n)
{
while(scanf("%d",&a[0]))
{
if(!a[0])
{
printf("\n");
break;
}
for(int i=1; i<n; i++)
{
scanf("%d",&a[i]);
}
while(!s.empty())
{
s.pop();
}
int j=0;
for(int i=0; i<n; i++)
{
b[i]=i+1;
s.push(b[i]);
if(s.top()==a[j])
{
s.pop();
j++;
while(!s.empty()&&s.top()==a[j])
{
s.pop();
j++;
}
}
}
while(!s.empty())
{
if(s.top()==a[j])
{
s.pop();
j++;
}
else
break;
}
if(s.size())
{
printf("No\n");
}
else
{
printf("Yes\n");
}
}
}
return 0;
}
<pre>