杨辉三角形

1.题目

例3.6打印杨辉三角形。
利用队列打印杨辉三角形。杨辉三角形的图案如图3.18所示。

2.算法思路


3.代码

//
// Created by trmbh on 2023-09-12.
//
#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0
#define MAXSIZE 50
#define QueueElementType int
/* 顺序队列 */
typedef struct {
    QueueElementType element[MAXSIZE];
    int front;
    int rear;
} SeqQueue;

void InitQueue(SeqQueue *Q) {
    Q->front = Q->rear = 0;
}

int EnterQueue(SeqQueue *Q, QueueElementType x) {
    /* 队列满(如果均用Q->front == Q->rear,那么无法判断队满还是队空,所以牺牲一个存储空间) */
    if ((Q->rear + 1) % MAXSIZE == Q->front) return FALSE;
    Q->element[Q->rear] = x;
    Q->rear = (Q->rear + 1) % MAXSIZE;
    return TRUE;
}

int DeleteQueue(SeqQueue *Q, QueueElementType *x) {
    /* 队列空 */
    if (Q->front == Q->rear) return FALSE;
    *x = Q->element[Q->front];
    Q->front = (Q->front + 1) % MAXSIZE;
}

int DestoryQueue(SeqQueue *Q) {
    Q->front = Q->rear = 0;
    return TRUE;
}

QueueElementType GetHead(SeqQueue *Q) {
    return Q->element[Q->front];
}

int IsEmpty(SeqQueue *Q) {
    if (Q->front == Q->rear) return TRUE;
    else return FALSE;
}

void Print_Space(){ printf("   ");}

void Format_Adjustment(int n, int count){
    /* 注意由于目前要打印的行其实是count-1, 所以如下所示n-(count-1)*/
    for (int i = 0; i < n - count + 1; i++) {
        Print_Space();
    }
}

void Print_Yang_Hui_Triangle(SeqQueue *Q) {
    /* 这里初始化第一行后,从第二行开始 */
    int count = 2;
    int n;
    QueueElementType temp, x;
    scanf("%d", &n);
    /* 初始化第一行第一个元素,这里由于下一行的值取决于上一行的值,所以先弄第一行作为基础 */
    EnterQueue(Q, 1);

    /* count的值对应第n行*/
    while (count <= n) {
        /* 第n行首个元素 */
        EnterQueue(Q, 1);
        Format_Adjustment(n, count);
        /* 获得第n行中间n-2个元素,同时打印第n-1行前n-2个元素*/
        for (int i = 1; i <= count - 2; i++) {
            DeleteQueue(Q, &temp);
            printf("%d", temp);
            Print_Space();
            Print_Space();
            x = GetHead(Q);
            EnterQueue(Q, temp + x);
        }
        /* 打印n-1行最后一个元素,第n行最后一个元素入队*/
        DeleteQueue(Q, &x);
        printf("%d\n", x);
        EnterQueue(Q, 1);
        count++;
    }

    /* 这里注意一个问题,第n行的元素在打印第n-1行时得到,在获得第n+1行时打印,有一个延迟,所以单独处理最后一行(第n行只入队未出队)*/
    while (!IsEmpty(Q)) {
        DeleteQueue(Q, &x);
        printf("%d", x);
        Print_Space();
        Print_Space();
    }
}

int main() {
    SeqQueue Q;
    InitQueue(&Q);
    Print_Yang_Hui_Triangle(&Q);
    DestoryQueue(&Q);
    return 0;
}
posted @ 2023-09-13 10:24  DawnTraveler  阅读(12)  评论(0编辑  收藏  举报