大概的思路就是 对每次测试的每个输入进行判断是否符合正确的出栈次序。分为3中情况,输入等于、大于和小于下标next,再分情况递增、入栈和判断栈顶元素是否相等。代码中有对应的注释。
#include<iostream>
#define Max_n 1001
using namespace std;
int main()
{
int M,N,K;
cin >> M >> N >> K;//输入第一行三个数据
int stack[Max_n];//用数组模拟栈
for(int j=0; j<K; ++j)
{
int flag = 0;//标志用来表示是否符合出栈的顺序
int next = 1, len = 0, tmp = 0;
for(int i=0; i<N; ++i)
{
cin >> tmp;
if(flag){
continue;
//用break会影响之后的输入,会出现输入没有完就结束的情况,
//用continue则可以保证输入结束后再给出结果
//break;
//flag为1,跳过此次,判断下一组数据是否满足
}
if(tmp == next){ //如果输入与下标相等
if(len < M){
//且在栈能够容纳的范围内,则进栈再出栈,这里直接下标增一
++next;
}
else{
flag = 1;//此时序列不满足正常的出栈次序
}
}
else if(tmp < next){//若输入小于下标,说明tmp已经在栈中
if(len==0 || stack[--len] != tmp){
flag = 1;
}
}
else{
while(len < M && tmp > next){
//若输入大于下标,则增加下标直到和tmp相等
stack[len++] = next++;
}
if(len < M){
//若栈还没满,则增加下标,判断下一个数是否还是满足
next++;
}
else{
flag = 1;
}
}
}
if(flag){
cout << "NO" << endl;
}
else {
cout << "YES" << endl;
}
}
return 0;
}