用队列实现杨辉三角

今天先敲了一遍循环队列,理解之后写了杨辉三角。

我用的算法是建两个队列,然后给第一个队列插入 0 1 0(这边解释一下为什么插入的是 0 1 0而不是1,主要是一个数据不好写循环语句;因为杨辉三角每一行要比前一行多一个数据,第一行1个,第二行2个,如果是单一个数据1,后面没办法实现加一因为根本没有两个数据可以加,如果是0 1 0,那么第一个是0直接置入,第二个就是0 + 1 = 1,后面一个就是1 + 0 = 1,接着 0直接置入,就得到第二行数据0 1 1 0,同理就容易写出循环语句了) ,用杨辉三角的算法即相邻两个数字相加之和插入第二个队列,有 0 的直接置入,计算完一个删除第一个队列的一个元素,然后检测第一个队列是否为空,若为空打印第二个队列,同时把第二个队列边打印边赋值给第一个队列这样就形成了一个循环,第一个队列永远存放需要计算的数,打印的永远是第二个队列,当然中间控制次数还需要动脑子扳手指计算一下。学习队列的这些子函数应该是基本要自己敲一遍的,所以中间有一些基本的子函数没有贴上来。至于头文件无非是声明队列、子函数之类的并没有任何不一样的地方。

代码如下:

#include
#include"queue.h"

int main()
{
    int tmp, sum1, sum2, n, i, j, k;
    Queue s1, s2;
    if(QueueInit(&s1) == failure || QueueInit(&s2) == failure) // 初始化判断
    {
        printf("Init failure!\n");
    }
    Enter(&s1, 0);
    Enter(&s1, 1);
    Enter(&s1, 0);
    printf("please input number:\n");
    scanf("%d",&n);
    for(i = 0; i < 2 * (n - 1); i++)             // 先行打印第一行数据
    {
        printf(" ");
    }
    printf("   1\n");





    for(j = 1; j < n; j++)                       //由输入的数控制的循环次数
    {
        for(i = 0; i < 2 * (n - 1 - j); i++)  //通过计算得到每一行前面需要空的空格数
        {
            printf(" ");
        }
        for(k = 0; k < j + 2; k++)
        {
            if(GetFront(&s1) == 0)            //s1 两个数计算置入s2的过程
            {
                Enter(&s2, 0);
            }
            sum1 = Delete(&s1);
            if(Empty(&s1) == TRUE)            //当s1空时打印  s2
            {
                while(Empty(&s2) != TRUE)
                {
                    sum1 = Delete(&s2);
                    Enter(&s1, sum1);
                    if(sum1 != 0)
                    {
                        printf("%4d", sum1);
                    }
                }
                printf("\n");
            }
            else
            {
                sum2 = GetFront(&s1);
                tmp = sum1 + sum2;
                Enter(&s2, tmp);
            }
        }
    }
    
    return 0;
}

 

你可能感兴趣的:(用队列实现杨辉三角)