【数据结构(C++)】用链队列计算杨辉三角
目录
第一节 概述
第二节 开源代码
第一节 概述
杨辉三角是二项式系数在三角形中的一种几何排列,是中国古代数学的杰出研究成果之一。它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的、数与形的结合。
在实际计算杨辉三角时,最常使用的数学规律是:
除第1行只有唯一的元素1外,每行的首元素和尾元素都是1;
从第3行开始,中间的每一个元素是上一行左右2个元素的和。
![](https://gss3.bdstatic.com/-Po3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike72%2C5%2C5%2C72%2C24/sign=09e1d9cac295d143ce7bec711299e967/d52a2834349b033b10f3c9131fce36d3d439bdfb.jpg)
由于杨辉三角的特殊性,我们采用链式队列结构存储与计算。
第二节 源代码
既然涉及到链式存储结构,首先要定义结点的数据存储格式。
每一个结点包含一个数据域和一个指针域,数据域用于存放队列的真实元素,指针域则指向队列中的下一个结点。
/*** 编者注:* 由于使用了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++)】用链队列计算杨辉三角相关推荐
- java数据结构队列杨辉三角_使用队列实现杨辉三角
使用队列实现杨辉三角 杨辉三角的特点: 除了第一行,其他行两端都为1: 从第三行开始可以看出,除了两端,其中每个数都是元素本身上面对着的两个数的和: 奇数行有奇数个数,偶数行有偶数个数,都是n个数 每 ...
- 【练习】c++分别用链队列和普通队列输出杨辉三角
普通队列: class queue {public:queue();bool empty()const;bool full() const;int get_front(int& x)const ...
- 杨辉三角队列c语言程序,C语言完整队列 与链式队列实现杨辉三角
贵州商专/// 编译环境VS2010 #include "stdafx.h" #include "stdlib.h" #define M 100 int max ...
- 队列实现杨辉三角(附详细图解)
之前我已经写了两篇关于队列的基本功能,今天我们使用循环顺序队来实现输出杨辉三角. 这是我们最终想要的效果:* 目录 一.算法思路 二.代码实现 三. 思考总结 一.算法思路 这里我将使用图示法配合文字 ...
- 利用队列输出杨辉三角 C语言
#include<stdio.h> #include<stdlib.h>#define MAXQSIZE 200typedef int QElemType;typedef st ...
- 计算杨辉三角的第n行,第m项数字
习题:杨辉三角 杨辉三角是二项式系数在三角形中的一种几何排列.它的每个数等于它上方两数之和,每行数字左右对称,由1 开始逐渐变大. 1 1 1 ...
- 数据结构--队列Queue--打印杨辉三角
杨辉三角大家很熟悉,不做介绍了,第n行的首末两元素均为1,中间n-2个元素由n-1行相邻两元素相加得到. 将第1行数据入队(1) -------队列表示(队头,- 队尾)------- 第2行数据1入 ...
- 20162303 队列加分项-杨辉三角
要求 用实现循环队列 参考PPT用循环队列打印杨辉三角 用JDB或IDEA单步跟踪排队情况,画出队列变化图,包含自己的学号信息 把代码推送到代码托管平台 把完成过程写一篇博客:重点是单步跟踪过程和遇到 ...
- 利用队列实现打印杨辉三角
如题 思路: 每一次打印前,队列中含有的元素都是该层的有序元素 目标是利用目前队列的元素,依次有序算出下一层的元素并放进队列 1.如果只打印一层,那就是1. 2.先插入队头元素,然后再判断除了队头元素 ...
最新文章
- python读取json文件报 No JSON object could be decoded
- 从时间管理聊到技术人如何保持竞争力?
- adb shell am 命令启动activity、Service、Borascast
- 高斯-勒让德公式 求积分
- VTK:几何对象之OpenVROrientedCylinder
- 深入理解 python 中的赋值、引用、拷贝、作用域
- 回文数-时间变换-判断邮箱
- centos 7 firefox启用java_一文详解各种花里胡哨的Java调试技巧,多图预警,记得收藏...
- 『计算机视觉』Mask-RCNN_锚框生成
- 构建和管理容器的10个技巧
- c mysql 数据更新_MySQL数据更新
- SPSS实现重复测量方差分析
- 详解数据库的第一范式、第二范式、第三范式、BCNF范式
- 微信公众号推送文图片什么尺寸最佳?(转)
- 今日头条推荐算法原理
- 教你如何布置家庭影院
- java100内奇数和偶数的和
- 计算机硬盘根目录是什么,硬盘根目录是什么意思?存放哪里?
- html5 css图片倒影,CSS3----图片倒影效果
- pytorch加载训练数据集dataloader操作耗费时间太久,该如何解决?