链队列的应用——打印杨辉三角

 链队列的一个小应用可以用来打印杨辉三角。虽然打印杨辉三角的方法有很多,也不需要使用到数据结构,但是这里可以用数据结构来实现从而达到复习的目的。下面我主要说一下这个小算法。还是应用结构体来封装数据,和下一个节点的指针。

每个存储节点:

typedef struct node
{
	int data;
	struct node *next;
}Node;
包含头指针和尾指针的链队列:

typedef struct 
{
	Node *front,*rear;

}LinkQueue;

假设我们需要打印5行的杨辉三角,可以尝试着从其中找到规律。

链队列的应用——打印杨辉三角_第1张图片



可以看到两边的数字均为1,而中间的数字可以看成是该数字肩上的两个数字之和。那么同样的,两边的1我们是否也可以看成是其肩上

的两个数之和呢?其实是可以的,我们可以在1的旁边各添加一个0。那么两边的1就可以看成是1+0,那么算法上实现起来会方便的多。

杨辉三角的这个规律只能从第2行开始,所以我们必须先单独打印第一行,后面的再按照上面提到的规律进行打印。

 从第二行开始分析:第二行的每个元素均是第一行的元素的和,所以可以创建链队列来保存上一行元素的和,可以为每一行创建一

个链队列但是当打印的行数很多时,会占用大量的内存。所以这里使用的方法是:每打印完一个元素之后,便用一个变量来存储该元素,

同时将该元素弹出给队列。

链队列的应用——打印杨辉三角_第2张图片

(1)当打印完第一行的1后,将1插入队列,再将0插入队列。

(2)在打印第二行时,先将1移出队列,与s=0相加(这里的s就是用来保存上次被移出队列的元素的),结果为sum=1,

(此时被移除队列的元素为1,所以s=1)将sum打印出来,然后把sum的值出入队尾。依次按照这样的流程打印完第二行。

(3)打印完第二行后,先在队尾插入元素0,保存被移出队列的变量s=0。sum=1+s=1;打印出sum的值,将sum插入队列。

此时s=1(因为上次打印sum时,移出队列的值为1),然后再将队列的下一个元素1移出来和s相加,结果sum=2,打印该结

果,并将该结果插入队尾。以此类推打印后面的行。


二、算法的实现

void printYanghuiTriangle(LinkQueue *linkqueue,int n)
{
	int sum=0,temp=0,s=0;//sum保存两数的和;temp保存被移出队列的元素;s保存上次移除队列的元素
	cout<<1<



你可能感兴趣的:(C++基础,数据结构与算法)