队列的应用之打印杨辉三角形

题目:

        利用队列打印杨辉三角形

特点:

        杨辉三角除第一行为两个1以外,从第二行开始,每一行的首尾都为1,中间位置的数为上一行中与之相邻的两个数之和,可以使用我们学过的队列问题来解决:

代码:

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 100

typedef int ElemType;
typedef struct{
	ElemType data[MaxSize];	    //队列的存储空间 
	int front,rear;            //队列的队头指针和队尾指针 
}Queue; 

//初始化队列
void Init_Queue(Queue *Q){
	Q->front=Q->rear=0;
} 

//判断队列是否为空
int Empty_Queue(Queue *Q){
	return Q->rear==Q->front;
} 

//进栈 
void In_Queue(Queue *Q,int e){
	if(Q->rear==MaxSize){
		return;
	}
	Q->data[Q->rear]=e;
	Q->rear+=1;
}

//出栈 
void Out_Queue(Queue *Q,int *e){
	if(Q->rear==Q->front){
		return;
	}
	*e=Q->data[Q->front];
	Q->front+=1;
}

//获取队头元素
void Front_Queue(Queue *Q,ElemType *x) {
	if(Empty_Queue(Q)){
		return;
	}else{
		*x=Q->data[Q->front];
	}
}

//打印杨辉三角
void yhsj(int m){
	Queue Q;
	int i,s,e,k;
	
	for(i=1;i<=m;i++){
		printf(" ");
	}
	
	printf("%-6d\n",1);
	Init_Queue(&Q);
	In_Queue(&Q,1);
	k=1;
	
	while(k<m){
		//每往下一行,其第一个数字都需要往左移动1个占位
		for(i=1;i<=m-k;i++){
			printf(" ");
		}
		do{
			Front_Queue(&Q,&e);
			if(e){
				printf("%-5d",e);
			}else{
				printf(" \n");
			}
			
		} while(e!=0);
		k++;
	}
	
	Out_Queue(&Q,&e);
	while(!Empty_Queue(&Q)){
		Out_Queue(&Q,&e); 
		printf("%-5d",e);
	}
} 

int main(){
	int number;
	printf("请输入杨辉三角打印的行数:");
	scanf("%d",&number);
	yhsj(number); 
	return 0;
}

 效果图:

猜你喜欢

转载自blog.csdn.net/qq_42680327/article/details/129862563