题目要求:
给定一个可以保持的堆栈M最多数字。推N1、2、3、...,N并随机弹出。您应该判断给定的数字序列是否是堆栈的可能的弹出序列。例如,如果M是 5 和N是 7,我们可以从堆栈中得到 1、2、3、4、5、6、7,但不能得到 3、2、1、7、5、6、4。
输入规格:
每个输入文件都包含一个测试用例。对于每种情况,第一行包含 3 个数字(均不超过 1000):M(堆栈的最大容量),N(推送序列的长度),以及K(要检查的 pop 序列数)。然后K接下来是几行,每行都包含一个N数字。一行中的所有数字都用空格分隔。
输出规格:
对于每个弹出序列,如果它确实是堆栈的可能弹出序列,则在一行中打印"YES",如果不是,则打印"NO"
示例输入:
5 7 5
1 2 3 4 5 6 7
3 2 1 7 5 6 4
7 6 5 4 3 2 1
5 6 4 3 7 2 1
1 7 6 5 4 3 2
示例输出:
YES
NO
NO
YES
NO
题解:
思路如注释所示,可通过所有测试点。
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
int M,N,K;
cin>>M>>N>>K;
int stack[M+5] = {0};
int check[N+5] = {0};
while(K--){
int top=-1;
for(int i=1;i<=N;i++) cin>>check[i];
for(int i=1,j=1;i<=N;i++){
stack[++top] = i; //依次进栈
if(top==M) break; //栈已经存储满,仍然没有遇见该弹出的元素
while(top!=-1&&stack[top] == check[j]){
top--;
j++;
}
}
if(top == -1) cout<<"YES\n";
else cout<<"NO\n";
}
return 0;
}