(c语言)02 线性结构4 Pop Sequence(仔细讲解)

我知道学习《数据结构》不要有抱怨,每一步都是脚踏实地,但是有时候,面对这种不是自己写的程序,话不多说上代码!
在这里插入图片描述

//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");
	}
发布了63 篇原创文章 · 获赞 2 · 访问量 1451

猜你喜欢

转载自blog.csdn.net/m0_37149062/article/details/105053133
今日推荐