b_pat_弹出序列(栈模拟)

给定一个最多能存 M 个数字的栈,将 1∼N 按顺序压入栈中,过程中可随机弹出栈顶元素。
对于每个序列,如果可能是该栈的弹出序列,则输出一行 YES,否则输出一行 NO。

思路
一开始进栈元素一定是1(假设为v),然后因为给定的是出栈序列(假定为a),所以我们尝试将v递增至a[i](i∈[0,n)):

  • 如果能递增到a[i],则当前状态合法,停止入栈,且将栈顶元素(值为a[i])出栈
  • 否则,一定是因为栈顶元素不符合;或者栈容量超出m还没有遇到a[i]
#include<bits/stdc++.h>
using namespace std;
int main() {
    std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int msz,n,k; cin>>msz>>n>>k;

    while (k--) {
        stack<int> st;
        int v=1, valid=1;
        for (int i=0; i<n; i++) {
            int x; cin>>x;
            while (st.empty() || (st.size()<msz && st.top()<x)) 
                st.push(v++);
            if (st.top()!=x) valid=0;
            else             st.pop();
        }
        cout<<(valid?"YES":"NO")<<'\n';
    }
    return 0;
}
posted @ 2020-09-24 19:58  童年の波鞋  阅读(136)  评论(0编辑  收藏  举报