题目
思路:
首先将要判断的排列存入数组data【】,然后依次输入i
i<data[j] 情况不存在,直接返回error
i==data[j] 将i出栈,j++
i>data[j] 继续入栈 i++;
代码
//思路:首先用数组存储输入的顺序data【】,然后再按照1-m的顺序入栈,如果
//data[j]==刚入栈的数,就出栈;j++
//data[j]<刚入栈的数,继续入栈
//>则return 0;
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 1005
typedef struct{
int data[MAXSIZE];
int top;
}S,*SqStack;
int Judge(int *a,int n,int m);
int push(int i,SqStack s,int m);
void pop(SqStack s);
int main()
{
int m,n,k;
int i,j,flag;
scanf("%d%d%d",&m,&n,&k);
int a[n];
for(i = 0;i<k;i++)
{
for(j = 0;j<n;j++)
{
scanf("%d",&a[j]);
}
flag = Judge(a,n,m);
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
int push(int i,SqStack s,int m)
{
if(s->top+1!=m)
{
s->data[++(s->top)] = i;
return 1;
}
return 0;
}
void pop(SqStack s)
{
s->top--;
}
int Judge(int *a,int n,int m)
{
SqStack s = (SqStack)malloc(sizeof(S));
int flag,j = 0,i = 1;
s->top = 0;
s->data[0] = i;
i++;
while(j != n)
{
if(a[j]>s->data[s->top])
{
flag = push(i,s,m);
if(!flag)//栈满可直接判断不成立
return 0;
i++;
}
else if(a[j]==s->data[s->top])
{
pop(s);
j++;//不需要i++
}
else
return 0;
}
return 1;
}