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

之前我已经写了两篇关于队列的基本功能,今天我们使用循环顺序队来实现输出杨辉三角。

这是我们最终想要的效果:*
在这里插入图片描述

一.算法思路

这里我将使用图示法配合文字。

很显然,我们需要一个一个具有某种控制条件的循环来完成这个功能。

首先

这里我们得需要四个变量,

    int line = 7;//杨辉三角的行数
	int value;
	int temp=0;
	int back;//接受SQPop函数(出栈函数)的返回值

因为我们需要知道我们要多少层的杨辉三角,所以在头部加一个for循环用于控制层数。

for (int i = 1; i < line; )

注:这里先不加i++,因为什么时候换行是需要更复杂的条件判断的

接着

完成前期工作后,我们把首行的两个元素入队,也就是两个1,但还不够,我们还得入队一个0,具体作用稍后再说。如下图:

在这里插入图片描述

步骤一:出栈

将首元素出队,并把其中的值赋给value

		s.SQPop(back);
		value = back;

1

步骤二:加和后入队
将temp与value加和后的值 入队

	s.SQPush(temp+value);

2

步骤三:判断value的值
若此时value的值不是0,那么就输出value.
若为0,另作评判(之后讲)

if (value != 0)
		{
			cout << value <<" ";
		}

步骤四:赋值
将value的值赋给temp

	temp = value;

在这里插入图片描述

至此,我们已经遍历了一遍程序,接下来的思路基本一致:

步骤一:出队
将首元素出队,并把其中的值赋给value
步骤二:加和后入队
将temp与value加和后的值 入队
步骤三:判断value的值
若此时value的值不是0,那么就输出value.
若为0,另作评判(之后讲)
步骤四:赋值
将value的值赋给temp

在这里插入图片描述

进行到这里时,我们已经,输出了两个1了,也就是说,我们完成了第一行的输出,但问题来了,我们该如何换行,这里就体现了0的妙处了。

现在,我们开始第三次遍历程序:

步骤一:出队
将首元素出栈,并把其中的值赋给value
步骤二:加和后入队
将temp与value加和后的值 入队

在这里插入图片描述

步骤三:判断value的值
若value的值为0,那么代表一行的结束,我们应该换行,并让i+1,最后,我们还得再入队一个0,为下次换行做准备。

else
		{
			cout << endl;
			s.SQPush(0);
			i++;
		}

在这里插入图片描述

步骤四:赋值**
将value的值赋给temp

在这里插入图片描述
遍历完三遍,所有的情况都遇过了,我们也基本清除了该算法的基本过程,接下来按照这个规则推理即可。

二.代码实现

关于代码,这里只展示核心部分。
其他关于入队,出队,初始化的操作请移步我之前的文章。

附上链接
顺序队与链队(一)

#include"SqQueue.h"

void test()
{
	SQ s;
	s.SQInit();

	
	//杨辉三角的过程
	int line = 7;//杨辉三角的行数
	int value;
	int temp=0;
	int back;//接受SQPop函数的返回值
	
	s.SQPush(1);
	s.SQPush(1);
	s.SQPush(0);

	for (int i = 1; i < line; )
	{
		
		//出栈
		s.SQPop(back);
		value = back;
		s.SQPush(temp+value);
		if (value != 0)
		{
			cout << value <<" ";
		}
		else
		{
			cout << endl;
			s.SQPush(0);
			i++;
		}
		temp = value;
	}
	cout << endl;
}

int main()
{
	test();
	return 0;
}

三. 思考总结

说实话这个方法很巧,但不容易想到,因此我要注重积累,多看别人的方法,说不定这个方法可以移植到其他的场景。

  • 46
    点赞
  • 164
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Ornamrr

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

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

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

打赏作者

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

抵扣说明:

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

余额充值