1、每一次新输入一行都要更新flag,S->top,index
2、栈满的判断是<m-1,不是小于m
3、在新输入一个数字符合条件之后,index++之后,要判断栈顶的元素是否符合条件,此时要用while而不是if
4、判断为NO要用index<n
5、一定要注意更新要放在外循环和内循环之间,不能放到外面
#include <stdio.h>
#include <stdlib.h>
#define N 10005
struct StackNode
{
int data[N];
int top;
};
typedef struct StackNode*Stack;
Stack Create()
{
Stack S=(Stack) malloc(sizeof(struct StackNode));
S->top=-1;
return S;
}
int main()
{
int n,m,k;
scanf("%d %d %d",&n,&m,&k);
int index=1;
int flag=1;
Stack S=Create();
for(int i=0;i<k;i++)
{
int data;
S->top=-1;
index=1;
flag=1;
for(int j=0;j<n;j++)
{
scanf("%d",&data);
if(data==index)
{
index++;
while(S->data[S->top]==index&&S->top>=0)
{
//printf("S->data[%d]=%d",S->top,S->data[S->top]);
S->top--;
index++;
}
}
else if(S->top<m-1)
{
S->data[++S->top]=data;
}
else
{
flag=0;
}
}
// printf("S->data[%d]=%d %d %d\n",S->top,S->data[S->top],flag,index);
while(S->top>0)
{
if(S->data[S->top]==index)
{
S->top--;
index++;
}
else
{
break;
}
}
// printf("%d %d",S->top,flag);
if(index<n||!flag)
{
printf("NO\n");
}
else
{
printf("YES\n");
}
}
return 0;
}