Rails UVA - 514 (栈的应用)

题目连接

最初看到这个题不是很明白题意,反复理解了之后才明白。
也就是说,已知进栈的顺序是从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;

}

猜你喜欢

转载自blog.csdn.net/weixin_43508782/article/details/85062985