1051 Pop Sequence [模拟]

题目大意:给定一个最大容量为 M 的堆栈,将 N 个数字按 1, 2, 3, ..., N 的顺序入栈,允许按任何顺序出栈,则哪些数字序列是不可能得到的?

大致思路:一个数有两种情况:1)这个数字一进来就溜了 在违法的边缘试探 2)这个数先在栈里面待着伺机而动

根据题目所给的序列我们可以用一个队列q将其保存起来,接着按顺序让数字进来挨打,判断s.top()和q.top()是否相同,如果相同就一起push,如果不同则把这个数push进栈。这样如果顺序合法的话最后栈和队列都是空的。详见代码~

#include <bits/stdc++.h>
#define maxn 1005
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
int n,m,k,x;
int a[maxn];
stack<int> st;
queue<int> q;
int main()
{
    cin>>n>>m>>k;
    while(k--)
    {
        while(!st.empty())
            st.pop();
        while(!q.empty())
            q.pop();
        for(int i=1;i<=m;i++)
        {
            cin>>x;
            q.push(x);
        }
        int p=0,flag=0;
        while(true)
        {
            if(!st.empty()&&!q.empty()&&st.top()==q.front())
            {
                st.pop();
                q.pop();
            }
            else
            {
                p++;
                if(p>m)
                    break;
                st.push(p);
                if(st.size()>n)
                {
                    flag=1;
                    break;
                }
            }
        }
        if(flag)
            cout<<"NO"<<endl;
        else
        {
            if(st.empty()&&q.empty())
                cout<<"YES"<<endl;
            else
                cout<<"NO"<<endl;
        }
    }
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/FTA-Macro/p/10597068.html