之前我已经写了两篇关于队列的基本功能,今天我们使用循环顺序队来实现输出杨辉三角。
这是我们最终想要的效果:*
目录
- 一.算法思路
- 二.代码实现
- 三. 思考总结
一.算法思路
这里我将使用图示法配合文字。
很显然,我们需要一个一个具有某种控制条件的循环来完成这个功能。
首先,
这里我们得需要四个变量,
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;
步骤二:加和后入队
将temp与value加和后的值 入队
s.SQPush(temp+value);
步骤三:判断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;
}
三. 思考总结
说实话这个方法很巧,但不容易想到,因此我要注重积累,多看别人的方法,说不定这个方法可以移植到其他的场景。