题意:有n辆车在右边的铁轨上,中间有一短竖着的过渡的铁轨,他们都要开到左边的铁轨上,不能来回开,进中间铁轨后只能选择停留或者开到左边铁轨。
右边铁轨的车的排列顺序都为1,2……n,给你左边的铁轨的排列顺序,问你有没有可能出现左边的情况
思路:运用栈的结构写。
第一段代码是用stl写的,第二段是手写的
#include<iostream>
#include<string>
#include<cmath>
#include<stack>
using namespace std;
int a[1005];
int main()
{
int i,j,n,flag;
while(scanf("%d",&n),n!=0)
{
while(scanf("%d",&a[1]),a[1]!=0)
{
stack<int >s; //记住栈要在这里创建,相当于重置了一次
for(i=2;i<=n;i++)
scanf("%d",&a[i]);
i=j=1; //i是进去的那条的铁轨,j是出去的那条铁轨
while(1)
{ //中间的铁轨相当于一个i饿栈
if(s.empty()) //如果栈中是空的,看看进轨是否还有车,如果有车就进车
{
if(i>n) //如果i>n,说明车都进出完毕,flag=1
{ flag=1;break;}
else s.push(i++);
}
else //如果栈中非空,看看栈顶部和j的关系
{
if(s.top()==a[j]) //如果相等,出栈,j++
{
s.pop();j++;
}
else //如果不等,看看i处的车是不是用完了,用完了说明既不能出栈也无法进站,说明是NO
{
if(i>n)
{flag=0;break;}
else s.push(i++); //i出还有车,那么就进栈
}
}
}
if(flag)
cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
cout<<endl;
}
}
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
int a[1005];
struct stack
{
int top,date[1005];
};
stack s;
int main()
{
int i,j,n,flag;
while(scanf("%d",&n),n!=0)
{
while(scanf("%d",&a[1]),a[1]!=0)
{
s.top=0; //记住栈要在这里创建,相当于重置了一次
for(i=2;i<=n;i++)
scanf("%d",&a[i]);
i=j=1; //i是进去的那条的铁轨,j是出去的那条铁轨
while(1)
{ //中间的铁轨相当于一个i饿栈
if(s.top==0) //如果栈中是空的,看看进轨是否还有车,如果有车就进车
{
if(i>n) //如果i>n,说明车都进出完毕,flag=1
{ flag=1;break;}
else s.date[++s.top]=i++;
}
else //如果栈中非空,看看栈顶部和j的关系
{
if(s.date[s.top]==a[j]) //如果相等,出栈,j++
{
s.top--;j++;
}
else //如果不等,看看i处的车是不是用完了,用完了说明既不能出栈也无法进站,说明是NO
{
if(i>n)
{flag=0;break;}
else s.date[++s.top]=i++; //i出还有车,那么就进栈
}
}
}
if(flag)
cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
cout<<endl;
}
}