最初看到这个题不是很明白题意,反复理解了之后才明白。
也就是说,已知进栈的顺序是从1~n,然后 给定一种出栈的顺序,判断这个出栈顺序是否能够成立。
比如n为3的时候
可能的出栈顺序就是
3,2,1 (所有火车入栈之后再一辆辆出栈)或者 1,2,3 (这种是入一辆出一辆),也可能是2,3,1
(就是1入,2入,2出,3入,3出,1出)等。
那么该怎么考虑这个问题呢
那么首先用一个数组a[maxn]来保存题中给出的出栈顺序。
然后进行比对。
设i=1(i用来表示入栈的火车),j=1(用来表示出栈的火车数组下标);
那么当 i==a[j]时,说明这辆火车是入栈后,紧接着就出栈了,则成立,我们就 考虑下一个i和下一个j(i++,j++)
如果 i != a[j] 时,那么就考虑当前的栈尾的火车,是不是等于a[j] 如果是的话,就使这辆火车出栈,然后j++,考虑下一个火车。
如果不等于栈尾的火车,那么就 先将i压入栈。
临界条件则是 i>n了 而j还没有到 n 这个时候就肯定不能实现了
AC代码如下:
#include <iostream>
#include <stack>
using namespace std;
const int maxn=1e3;
int a[maxn]; //用来存放出栈火车的顺序
int main()
{
int n;//n辆火车
while(cin>>n && n )
{
for(int k=0;k<n;k++)
{
cin>>a[k];
if(!a[k])
break;
if(k==n-1)
{
int i=1;
stack <int> st; //用来模拟火车的出栈入栈
bool tag=false;
for(int j=0;j<n;) //遍历出栈火车
{
if(i==a[j])//入栈后立马出栈的情况
i++,j++;
else if( !st.empty() && st.top()==a[j])
j++,st.pop();
else if ( i<=n )st.push(i++);
else //说明这时候不满足了
{
tag=true;
break;
}
}
if(tag)
cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
if(k==n-1 && a[0])
k=-1;
}
cout<<endl;
}
return 0;
}