题目大意:
给一个栈的最大容量M,然后给出K个长度为N的出栈序列,入栈的顺序是从1—N,问这些出栈序列是否符合出栈规则。
解题思路:
模拟栈的入栈出栈即可,每次比较栈顶元素和序列当前元素,相同则出栈且指针指向序列的下一个元素。要注意栈的容量有限制,如果当前栈内元素超过了这个容量也是不符合规则的。
代码如下:
#include<iostream>
#include<cstdio>
#include<fstream>
#include<set>
#include<cmath>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<iomanip>
#include<cstdlib>
#include<list>
#include<queue>
#include<stack>
#include<algorithm>
#define inf 0x3f3f3f3f
#define MOD 1000000007
#define mem0(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define meminf(a) memset(a,inf,sizeof(a))
//vector ::iterator it;
//set<int>::iterator iter;
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int main()
{
// std::ios::sync_with_stdio(false);
// cin.tie(0);
// freopen("test.txt","r",stdin);
// freopen("output.txt","w",stdout);
int m,n,k;
scanf("%d %d %d",&m,&n,&k);
while(k--)
{
stack<int> s;
int data[1100]={0},cur=0;
bool flag=true;
for(int i=0;i<n;i++)scanf("%d",&data[i]);
for(int i=1;i<=n;i++)
{
s.push(i);
if(s.top()==data[cur]&&s.size()<=m)//栈顶元素相等且没有超出栈的容量
{
cur++;
s.pop();
while(!s.empty()&&s.top()==data[cur])//注意栈是否为空的条件要放在前面
{
cur++;
s.pop();
}
}
else if(s.size()>m)//超出栈容量的限制
{
flag=false;
break;
}
}
if(!s.empty()) flag=false;
if(flag)printf("YES\n");
else printf("NO\n");
}
return 0;
}