我知道学习《数据结构》不要有抱怨,每一步都是脚踏实地,但是有时候,面对这种不是自己写的程序,话不多说上代码!
//pop-sequence
#include<stdio.h>
int main()
{
int N,M,K;
int i,j,a[1000];
scanf("%d %d %d",&M,&N,&K);
for(i=0;i<K;i++){ //k=5
for(j=0;j<N;j++){ //n=7
scanf("%d",&a[j]);
}
int stack[1000]={0};
int top = 0;
int num = 1;
j = 0,stack[0]=num;
while(j<N){ // j=1
if(a[j]<stack[top]) //F
break;
while(a[j]>stack[top]) //F
stack[++top] = ++ num;
if(top>=M)
break;
if(a[j]=stack[top])
top--;
if(top<0) stack[++top] = ++num; //top=0
j++;
}
if(j==N)
printf("YES\n");
else
printf("NO\n");
}
}
难点是在于处理,处理是有条件的,当你读入的数据等于你的栈顶数据,继续压栈,当你读入的数据小于栈顶元素,说明无法弹出,直接输出NO,当你的读入的数据大于栈顶元素,继续压栈!
也就是a[j]<stack[top]、a[j]==stack[top] 、a[j]>stack[top]
中间还要判定是否压栈的次数是否更堆栈的数量有冲突,如果是,那就NO
for(i=0;i<K;i++){ //k=5
for(j=0;j<N;j++){ //n=7
scanf("%d",&a[j]);
}
int stack[1000]={0};
int top = 0;
int num = 1;
j = 0,stack[0]=num;
while(j<N){ // j=1
if(a[j]<stack[top]) //F
break;
while(a[j]>stack[top]) //F
stack[++top] = ++ num;
if(top>=M)
break;
if(a[j]=stack[top])
top--;
if(top<0) stack[++top] = ++num; //top=0
j++;
}
if(j==N)
printf("YES\n");
else
printf("NO\n");
}