题目详情
结果提示
思路:按顺序依次入栈直至栈顶元素和要抛出的元素相同,最后检查栈是否为空来判断能否实现这种出栈顺序
#include<stdio.h>
#include<stdlib.h>
struct Stack {/*结构声明*/
int *Data;
int Top;
int Maxsize;
};
struct Stack *CreatStack(int Maxsize) {
struct Stack *s=(struct Stack *)malloc(sizeof(struct Stack));//创建栈
s->Data=(int*)malloc(sizeof(int));
s->Top=-1;
s->Maxsize=Maxsize;
return s;
}
int Isfull(struct Stack *s) {
return (s->Top==(s->Maxsize)-1);//判断栈满
}
int Push(struct Stack*s,int x) {
if(Isfull(s)) {
return 0;
} else { //入栈
s->Data[++(s->Top)]=x;
return 1;
}
}
int Isempty(struct Stack*s) {
return(s->Top==-1); //判断栈空
}
int Pop(struct Stack*s) {
if (Isempty(s)) {
return 0; //出栈
} else {
(s->Top)--;
return 1;
}
}
void Pd(int max,int m) {
int cs=0;
int shuju;
int i;
int flag=0;
struct Stack*Ls=CreatStack(max);
scanf("%d",&shuju);
for (i=1;i<=m;i++) {
if(Ls->Top==-1||shuju!=(Ls->Data[Ls->Top])) {
if (Ls->Top<max-1) {
Push(Ls,i);
} else {
cs=1;
}
}
//printf("i=%d 顶元素=%d shuju=%d top=%d\n",i,Ls->Data[Ls->Top],shuju,Ls->Top);
if (cs==1) break;
while(Ls->Top!=-1&&shuju==(Ls->Data[Ls->Top])) {
Pop(Ls);
//printf("i=%d 顶元素=%d shuju=%d top=%d\n",i,Ls->Data[Ls->Top],shuju,Ls->Top);
flag++;
if (flag<m) {
scanf("%d",&shuju);
}
}
}
for (i=flag+1;i<m;i++) {
scanf("%d",&shuju);
}
if (Ls->Top==-1) {
printf("YES\n");
} else {
printf("NO\n");
}
//free (Ls->Data);
//free (Ls);
}
int main()
{
int max,m,n;
scanf("%d %d %d",&max,&m,&n);
int i;
for (i=0;i<n;i++) {
Pd(max,m);
}
return 0;
}