杨辉三角循环队列实现(数据结构c语言版)

【问题描述】杨辉三角形是由〖(a+b)〗n二项式展开的各项系数形成的,当n=0,系数为1,生成第一行的元素;当a=1,a+b的各项系数组成第二行的元素;当n=2,a2+2ab+b^2的各项系数组成第三行的元素,以此类推。杨辉三角形的特点每一行的第一个元素和最后一个元素都为1;其他位置上的数字是上一行中与之相邻的两个整数之和。请利用队列打印杨辉三角形前n行元素。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
【基本要求】
输入一个整数,表示打印杨辉三角形的行数
按照图示的三角形的形式在屏幕上打印出杨辉三角形。
【测试数据】
输入打印杨辉三角形的行数3,输出
1
1 1
1 2 1
输入打印杨辉三角形的行数7,输出
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
【实现提示】
可以利用循环队列实现打印杨辉三角形的过程:再循环队列中依次存放第i-1行上的元素,然后逐个出队并打印,同时生成第i行元素并入队。

//函数声明 
#include <stdio.h>
#define MAX 100
#define FALSE 0
#define TRUE 1
//循环队列
typedef struct {
    int element[MAX];
    int front; //头指针
    int rear;  //尾指针
} SeqQueue;
//初始化循环队列
void InitQueue(SeqQueue *q) { q->front = q->rear = 0; }
//入队
int EnterQueue(SeqQueue *q, int x) {
    if ((q->rear + 1) % MAX == q->front) {
        printf("---队列已满---");
        return FALSE;
    }
    q->element[q->rear] = x;
    q->rear = (q->rear + 1) % MAX;
    return TRUE;
}
//出队
int DeleteQueue(SeqQueue *q, int *x) {
    if (q->front == q->rear) {
        printf("---队列为空---");
        return FALSE;
    }
    *x = q->element[q->front];
    q->front = (q->front + 1) % MAX;
    return TRUE;
}
//取对头元素
int GetHead(SeqQueue *q, int *x) {
    if (q->front == q->rear)
        return FALSE;
    *x = q->element[q->front];
    return TRUE;
}
//判断队列是否为空
int IsEmpty(SeqQueue *q) {
    if (q->front == q->rear)
        return TRUE;
    else
        return FALSE;
}
//打印杨辉三角
void YangHuiTriangle(int N) {
    SeqQueue q;
    InitQueue(&q);
    int n, i, x, temp;
    EnterQueue(&q, 1); //第一行元素入队
    for (n = 2; n <= N; n++) {
        EnterQueue(&q, 1); //第n行第一个元素入队
        for (i = N; i >= n; i--) //给数字间加空格,打印出金字塔形状
            printf("   ");       // N为打印的行数,n为每行的元素个数
        for (i = 1; i <= n - 2; i++) { //利用队中第n-1行元素产生第n行的中间n-2个元素并入队
            DeleteQueue(&q, &temp);    //出队元素赋给temp
            printf("%6d", temp);       //打印第n-1行的元素
            GetHead(&q, &x);
            temp = temp + x;      //利用第n-1行元素产生第n行元素
            EnterQueue(&q, temp); //可以利用画图理解
        }
        DeleteQueue(&q, &x);
        printf("%6d", x); //打印n-1行最后一个元素
        EnterQueue(&q, 1);
        printf("\n");
    }
    while (!IsEmpty(&q)) { //打印最后一行
        DeleteQueue(&q, &x);
        printf("%6d", x);
    }
}
//主函数: 
int main() {
    int N;
    printf("请输入想打印的行数:");
    scanf("%d", &N);
    YangHuiTriangle(N);
    printf("\n");
    return 0;
}

在这里插入图片描述
在这里插入图片描述

  • 40
    点赞
  • 184
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张先生的蛇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值