参照教学章节中的视频讲解,及教材中队列的算法,使用之编写程序,打印出杨辉三角。
COMMON.C
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
SEQ.H
#define QueueElementType int //队列中元素为整数类型
#define MAXSIZE 50 //队列最大长度
//循环队列类型定义
typedef struct
{
QueueElementType element[MAXSIZE]; //队列元素存入数组
int front; //头指示器
int rear; //尾指示器
}SeqQueue;
//循环队列初始化
void InitQueue(SeqQueue *Q);
//循环队列入队
int EneterQueue(SeqQueue *Q,QueueElementType *x);
//循环队列出队
int DeleteQueue(SeqQueue *Q,QueueElementType *x);
//获取队首元素
int GetHead(SeqQueue *Q,QueueElementType *x);
SEQ.C
#include “common.h”
#include “seq.h”
//循环队列初始化
void InitQueue(SeqQueue *Q)
{
Q->front=Q->rear=0; //将队列初始化为空队列
}
//循环队列入队
int EnterQueue(SeqQueue *Q,QueueElementType x)
{
if((Q->rear+1)%MAXSIZE==Q->front) //头指针+1与队尾相同,表示队满了
return FALSE;
Q->element[Q->rear]=x; //x放入队尾
Q->rear=(Q->rear+1)%MAXSIZE; //设置队尾指示器位置+1,如果超出最大位置则要从数组0位置开始
return TRUE;
}
//循环队列出队
int DeleteQueue(SeqQueue *Q,QueueElementType *x)
{
if(Q->front==Q->rear) //队列为空
return FALSE;
*x=Q->element[Q->front]; //出队元素值存入x
Q->front=(Q->front+1)%MAXSIZE; //重新设置队首指针
return TRUE;
}
int GetHead(SeqQueue *Q,QueueElementType *x)
{
if(Q->front==Q->rear)
return FALSE;
*x=Q->element[Q->front];
return TRUE;
}
MAIN.C
#include “seq.h”
#define N 7 //假设打印7层三角
//使用循环队列算法,实现杨辉三角输出
int main()
{
int i,n,j; //循环控制变量
int x,temp; //存放元素值
SeqQueue Q; //声明一个循环队列
InitQueue(&Q); //队列初始化
EnterQueue(&Q,1); //第一行元素1进栈
for(n=2;n<=N;n++)
{
for(j=N-n+2;j>=1;j--) //格式控制,每行前输出空白
printf(" ");
EnterQueue(&Q,1); //每层开始为1,入队尾
for(i=1;i<=n-2;i++) //利用(n-1)上一层的元素,产生下一层中间n-2个元素
{
DeleteQueue(&Q,&temp); //上一层队首元素出队
printf("%3d",temp); //打印上一行元素值
GetHead(&Q,&x); //获取上一行目前元素的值
temp=temp+x; //计算出下一行的值
EnterQueue(&Q,temp); //将新值存入队尾
}
DeleteQueue(&Q,&x); //上一行最后一个元素出队
printf("%3d\n",x);
EnterQueue(&Q,1); //每层最后一个为1,入队
}
//打印出最后一行
while(Q.front!=Q.rear) //当队不为空时
{
DeleteQueue(&Q,&x);
printf("%3d",x);
}
return 0;
}