杨辉三角(用队列打印)

目录

1.问题描述

2.算法思路

3. 算法具体过程

4.  算法代码实现

1.问题描述

        运用队列的方法,将杨辉三角打印出来。

2.算法思路

        通过队列先进先出特性,每次将打印的出队列,再去出队后队首的元素值,进行相加得到下一行所求的值。

杨辉三角(用队列打印)_第1张图片

过程描述:

(1)左上的元素,出队列为temp=1,并且打印temp=1, 取出队后现在队首为x=3

(2)求下一行元素temp=temp+x

(3)到最后1前面那个数字也就是3停止遍历

(4)循环外面出队列打印最后一个一个元素 1 ,并且存储下一行最后一个元素数字 1

3. 算法具体过程

下面是打印第四行杨辉三角,以及存储第五行值进入队列的过程。

杨辉三角(用队列打印)_第2张图片

 4.  算法代码实现

#include
#define Maxsize 50
typedef struct{
    int data[Maxsize];
    int front,rear;
}SqQueue;

void InitQueue(SqQueue &Q){
    Q.rear=Q.front=0;
}

bool IsEmpty(SqQueue Q){
    if(Q.rear==Q.front)
        return true;
    return false;
}

bool EnQueue(SqQueue &Q,int x){
    if((Q.rear+1)%Maxsize==Q.front)    //判断队列是否满了
        return false;
    Q.data[Q.rear]=x;
    Q.rear=(Q.rear+1)%Maxsize;
    return true;
}

bool DeQueue(SqQueue &Q,int &x){
    if(IsEmpty(Q))    //判断队列是否为空
        return false;
    x=Q.data[Q.front];
    Q.front=(Q.front+1)%Maxsize;
    return true;
}

bool GetTop(SqQueue Q,int &x){
	if(IsEmpty(Q))
		return false;
	x=Q.data[Q.front];
	return true;
} 

void YangHuiTriangle(int N){
	int n,x,i,temp;
	SqQueue Q;
	InitQueue(Q); 
	
	EnQueue(Q,1);
	for(n=2;n<=N;n++){		//每一行进行打印 
		EnQueue(Q,1);		 //每行第一个都是数字 1	
		for(i=1;i<=n-2;i++){	//通过上一行求下一行 (第一行已知,所以可以求出第二行,依次类推)
			DeQueue(Q,temp);	//先取出最前面的元素,也就是要求下一行的左上方的元素 
			printf("%d ",temp);	//将其打印 
			GetTop(Q,x);	//得到上述出队后,当前最前方元素,也就是要求下一行的上方的元素 
			temp=temp+x;	//得到当前要求元素 
			EnQueue(Q,temp);	//将其入队 
		}
		DeQueue(Q,x);	//输出上一行最后一个 1	
		printf("%d ",x);
		EnQueue(Q,1);		//存储要求这一行最后一个数字 1 
		printf("\n");	//输出上一行的换行 
	}
	while(!IsEmpty(Q)){	//输出最后一行 
		DeQueue(Q,x);
		printf("%d ",x);
	}

}

int main(){
    int N;
    printf("请输入要打印的层数:");
    scanf("%d",&N);
    YangHuiTriangle(N);
	return 0;
}

你可能感兴趣的:(数据结构,数据结构)