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

这是我们最终想要的效果:*

杨辉三角算法实现 python 杨辉三角算法流程图_杨辉三角


目录

  • 一.算法思路


  • 二.代码实现
  • 三. 思考总结


一.算法思路

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

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

首先

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

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

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

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

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

接着

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

杨辉三角算法实现 python 杨辉三角算法流程图_数据结构_02

步骤一:出栈

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

s.SQPop(back);
		value = back;

杨辉三角算法实现 python 杨辉三角算法流程图_数据结构_03

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

s.SQPush(temp+value);

杨辉三角算法实现 python 杨辉三角算法流程图_杨辉三角函数_04

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

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

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

temp = value;

杨辉三角算法实现 python 杨辉三角算法流程图_杨辉三角函数_05

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

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

杨辉三角算法实现 python 杨辉三角算法流程图_数据结构_06

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

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

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

杨辉三角算法实现 python 杨辉三角算法流程图_数据结构_07

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

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

杨辉三角算法实现 python 杨辉三角算法流程图_杨辉三角_08

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

杨辉三角算法实现 python 杨辉三角算法流程图_杨辉三角_09


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

二.代码实现

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

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

#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;
}

三. 思考总结

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