目录

第一节  概述

第二节  开源代码


第一节  概述

杨辉三角是二项式系数在三角形中的一种几何排列,是中国古代数学的杰出研究成果之一。它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的、数与形的结合。

在实际计算杨辉三角时,最常使用的数学规律是:

  1. 除第1行只有唯一的元素1外,每行的首元素和尾元素都是1;

  2. 从第3行开始,中间的每一个元素是上一行左右2个元素的和。

图1 杨辉三角

由于杨辉三角的特殊性,我们采用链式队列结构存储与计算。


第二节  源代码

既然涉及到链式存储结构,首先要定义结点的数据存储格式。

每一个结点包含一个数据域和一个指针域,数据域用于存放队列的真实元素,指针域则指向队列中的下一个结点。

/*** 编者注:* 由于使用了C++作为编程语言* 建议使用*.hpp作为头文件的后缀名* *.h是C语言使用的头文件后缀名*/
#pragma once
template <class DataType>
struct Node
{DataType data;Node<DataType> *next;
};

队列是一种具有操作限制的表结构:只能在队列开头删除元素(出队)、读取元素(读队头),只能在队列末尾添加元素(入队)。除了这些基本操作,队列还需要判空。

由于是链式存储,必须由我们自己编写构造函数与析构函数,用于开辟和释放队列的结点。

/*** 编者注:* 下面的类与上面的结构体是配套的* 强烈建议放在同一个头文件中*/
template <class DataType>
class LinkQueue
{private:Node<DataType> *front, *rear; //队头、队尾指针public:LinkQueue();               //构造函数,初始化一个空的链队列~LinkQueue();              //析构函数,释放链队列中各结点的存储空间void EnQueue(DataType x);  //将元素x入队DataType DeQueue();        //将队头元素出队DataType GetQueue() const; //取链队列的队头元素bool Empty() const;        //判断链队列是否为空
};
#include <iostream>
#include <iomanip> //输出格式设置
/*** 记得在此处引入上面的头文件(建议使用*.hpp)*/
using namespace std;template <class DataType>
LinkQueue<DataType>::LinkQueue()
{Node<DataType> *s = new Node<DataType>;s->next = nullptr;front = rear = s;
}template <class DataType>
LinkQueue<DataType>::~LinkQueue()
{Node<DataType> *p = nullptr;while (front != nullptr){p = front->next;delete front;front = p;}
}template <class DataType>
void LinkQueue<DataType>::EnQueue(DataType x)
{Node<DataType> *s = new Node<DataType>; //申请节点ss->data = x;                            //将数据存入结点s->next = nullptr;                      //封闭队尾rear->next = s;                         //将新节点接入原队尾rear = s;                               //更新队尾
}template <class DataType>
DataType LinkQueue<DataType>::DeQueue()
{Node<DataType> *p = nullptr;DataType x;if (rear == front)throw "错误:下溢!";p = front->next;x = p->data;           //暂存队头元素front->next = p->next; //摘链if (p->next == nullptr)rear = front;delete p;return x;
}template <class DataType>
DataType LinkQueue<DataType>::GetQueue() const
{if (front != rear)return (front->next->data);elsethrow "错误:空队列!";
}template <class DataType>
bool LinkQueue<DataType>::Empty() const
{return (front == rear);
}

现在,终于到了解释主算法的时候了!每一句的逻辑都注释在代码中:

//杨辉三角,其中n是总行数
void nCr(int n)
{LinkQueue<int> queue;         //初始化空队列for (auto i = 1; i <= n; i++) //对于每一行{if (i == 2) //在第2行时{cout << setw(3) << queue.DeQueue() << endl;queue.EnQueue(1); //加上行首的元素1}else if (i > 2) //第3行及之后{queue.EnQueue(1);                   //补上行首的元素1for (auto j = 1; j <= (i - 2); j++) //每行的求和元素比行序号少2{auto temp = queue.DeQueue(); //将求和元素的左元素(上一行)出队并另存cout << setw(3) << temp << " ";queue.EnQueue(temp + queue.GetQueue()); //读取右元素(上一行),将左右元素相加并入队}cout << setw(3) << queue.DeQueue() << endl; //输出上一行末尾的元素1}queue.EnQueue(1); //在行尾补元素1}//若队列非空,输出最后一行的元素while (!queue.Empty()){cout << setw(3) << queue.DeQueue() << " ";}cout << endl<< endl;
}

【数据结构(C++)】用链队列计算杨辉三角相关推荐

  1. java数据结构队列杨辉三角_使用队列实现杨辉三角

    使用队列实现杨辉三角 杨辉三角的特点: 除了第一行,其他行两端都为1: 从第三行开始可以看出,除了两端,其中每个数都是元素本身上面对着的两个数的和: 奇数行有奇数个数,偶数行有偶数个数,都是n个数 每 ...

  2. 【练习】c++分别用链队列和普通队列输出杨辉三角

    普通队列: class queue {public:queue();bool empty()const;bool full() const;int get_front(int& x)const ...

  3. 杨辉三角队列c语言程序,C语言完整队列 与链式队列实现杨辉三角

    贵州商专/// 编译环境VS2010 #include "stdafx.h" #include "stdlib.h" #define M 100 int max ...

  4. 队列实现杨辉三角(附详细图解)

    之前我已经写了两篇关于队列的基本功能,今天我们使用循环顺序队来实现输出杨辉三角. 这是我们最终想要的效果:* 目录 一.算法思路 二.代码实现 三. 思考总结 一.算法思路 这里我将使用图示法配合文字 ...

  5. 利用队列输出杨辉三角 C语言

    #include<stdio.h> #include<stdlib.h>#define MAXQSIZE 200typedef int QElemType;typedef st ...

  6. 计算杨辉三角的第n行,第m项数字

    习题:杨辉三角  杨辉三角是二项式系数在三角形中的一种几何排列.它的每个数等于它上方两数之和,每行数字左右对称,由1 开始逐渐变大.          1         1   1          ...

  7. 数据结构--队列Queue--打印杨辉三角

    杨辉三角大家很熟悉,不做介绍了,第n行的首末两元素均为1,中间n-2个元素由n-1行相邻两元素相加得到. 将第1行数据入队(1) -------队列表示(队头,- 队尾)------- 第2行数据1入 ...

  8. 20162303 队列加分项-杨辉三角

    要求 用实现循环队列 参考PPT用循环队列打印杨辉三角 用JDB或IDEA单步跟踪排队情况,画出队列变化图,包含自己的学号信息 把代码推送到代码托管平台 把完成过程写一篇博客:重点是单步跟踪过程和遇到 ...

  9. 利用队列实现打印杨辉三角

    如题 思路: 每一次打印前,队列中含有的元素都是该层的有序元素 目标是利用目前队列的元素,依次有序算出下一层的元素并放进队列 1.如果只打印一层,那就是1. 2.先插入队头元素,然后再判断除了队头元素 ...

最新文章

  1. python读取json文件报 No JSON object could be decoded
  2. 从时间管理聊到技术人如何保持竞争力?
  3. adb shell am 命令启动activity、Service、Borascast
  4. 高斯-勒让德公式 求积分
  5. VTK:几何对象之OpenVROrientedCylinder
  6. 深入理解 python 中的赋值、引用、拷贝、作用域
  7. 回文数-时间变换-判断邮箱
  8. centos 7 firefox启用java_一文详解各种花里胡哨的Java调试技巧,多图预警,记得收藏...
  9. 『计算机视觉』Mask-RCNN_锚框生成
  10. 构建和管理容器的10个技巧
  11. c mysql 数据更新_MySQL数据更新
  12. SPSS实现重复测量方差分析
  13. 详解数据库的第一范式、第二范式、第三范式、BCNF范式
  14. 微信公众号推送文图片什么尺寸最佳?(转)
  15. 今日头条推荐算法原理
  16. 教你如何布置家庭影院
  17. java100内奇数和偶数的和
  18. 计算机硬盘根目录是什么,硬盘根目录是什么意思?存放哪里?
  19. html5 css图片倒影,CSS3----图片倒影效果
  20. pytorch加载训练数据集dataloader操作耗费时间太久,该如何解决?

热门文章

  1. 03-07 创建和编辑AutoCAD实体(七) 向图形中添加文字(1)使用文字样式
  2. 哪一门编程语言入门很难学呢?看看这份编程语言排行榜
  3. java splash screen_Java splash screen
  4. linux tail 自动刷新,Linux命令: tail
  5. linux 中国-新手村,《我的侠客》手游新手村任务集合攻略
  6. Google Earth KML中文说明
  7. shutdown参数详解
  8. [66]--加1--简单
  9. Web安全攻防 渗透测试实战指南2
  10. textarea赋值的属性