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

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

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

一.算法思路

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

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

首先

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

    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
    点赞
  • 160
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
好的,我来为您详细解答。 首先,让我们来回顾一下杨辉三角的定义:杨辉三角是一个三角形的数表,它的第 $n$ 行有 $n$ 个数,其中第 $i$ 行的第 $j$ 个数等于组合数 $\binom{i-1}{j-1}$。 现在我们来考虑如何用队列实现杨辉三角。具体步骤如下: 1. 首先,我们创建一个空队列,用来存储每一行的数字。 2. 然后,我们将第一行的数字 1 入队。 3. 接下来,我们使用循环来生成杨辉三角的每一行。循环的次数为杨辉三角的行数减 1(因为第一行已经入队了)。 4. 在循环内部,我们首先将当前行的第一个数字 1 入队。 5. 然后,我们使用一个内层循环来生成当前行的其他数字。内层循环的次数为当前行的行号减 1,因为当前行的第一个数字已经入队了。 6. 在内层循环内部,我们从队列中取出上一行的两个数字,计算它们的和,并将和入队。这样就完成了当前行的数字的生成。 7. 最后,我们将当前行的最后一个数字 1 入队,这样就完成了一行数字的生成。 8. 循环结束后,队列中存储的就是整个杨辉三角的数字。我们可以按行依次输出队列中的数字,就可以得到完整的杨辉三角了。 下面是使用 Python 代码实现以上步骤的详细设计: ```python from queue import Queue def generate_yanghui_triangle(num_rows): # 创建一个空队列 q = Queue() # 将第一行的数字 1 入队 q.put(1) # 生成杨辉三角的每一行 for i in range(num_rows - 1): # 先将当前行的第一个数字 1 入队 q.put(1) # 内层循环生成当前行的其他数字 for j in range(i): # 取出上一行的两个数字,计算它们的和,并将和入队 a, b = q.get(), q.queue[0] q.put(a + b) # 最后将当前行的最后一个数字 1 入队 q.put(1) # 按行依次输出队列中的数字,得到完整的杨辉三角 res = [] for i in range(num_rows): row = [] for j in range(i + 1): row.append(q.get()) res.append(row) return res ``` 希望我的解答能够帮助到您!如果您还有其他问题,随时提出。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Ornamrr

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

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

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

打赏作者

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

抵扣说明:

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

余额充值