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;
}