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

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

每个存储节点:

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

typedef struct 
{
	Node *front,*rear;

}LinkQueue;

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



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

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

杨辉三角的这个规律只能从第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<<endl;//先打印第一行
	InsertElem(linkqueue,1);
	for (int i=2;i<n;i++)
	{
		InsertElem(linkqueue,0);//每打印新的一行,需要添加0,用于计算杨辉三角的两边
		for (int j=1;j<=i;j++)
		{
			DeleteElem(linkqueue,temp);//将队头的元素移出,同时用temp保存
			sum=temp+s;//用上次移出的元素和这次移出的元素相加得到新的一行的元素
			cout<<sum<<"  ";//打印空格
			InsertElem(linkqueue,sum);//将新的元素插入队列
			s=temp;//s保存上次移出的元素

		}
		cout<<endl;
	}
}



  • 12
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值