1051 Pop Sequence (25 分)
题目大意
给出k个出栈序列,请你依次判断它们是否合法
基本思路
用堆栈模拟出入栈的过程,直接看注释就好。
代码
#include <bits/stdc++.h>
using namespace std;
int main(){
int m,n,k;
cin>>m>>n>>k;
while(k--){
int flag=0;
//读入出栈序列
vector<int> v(n+1);
for(int i=1;i<=n;i++){
cin>>v[i];
}
//模拟入栈和出栈的过程
stack<int> s;//新建一个栈
int current=1;//数组中下一个出栈的元素下标
for(int i=1;i<=n;i++){
//将元素入栈
s.push(i);
//栈溢出
if(s.size()>m){
break;
}
//当栈非空并且下一个出栈的元素正好等于栈顶元素
while(!s.empty()&&v[current]==s.top()){
s.pop();
current++;
}
}
//判断入栈和出栈上述的过程是否正常完成,正常完成时current刚好等于n+1
if(current==n+1){
flag=1;
}
//输出
if(flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}