用循环队列实现打印杨辉三角(数据结构)

打印二项式系数表(即杨辉三角)

                          1

                       1 2 1

                     1 3 3 1

                   1 4 6 4 1

系数表中的第K行有k+1个数,除了第一个数和最后一个数为1外,其余的数则为上一行中位其左右的两数之和。

如果要求计算并输出杨辉三角前N行的值,则队列的最大空间应为n+2(第N行有n+1个数,且根据循环队列的特性:“少用一个元素”,但在这里少用的那个元素用来存放临界值“0”)。

#include"QueueSq.cpp"
void InitQueue(SqQueue &Q,int n)
{
    Q.elem=new QElemType[n];
    //为循环队列分配空间(比实际能用多一个元素)
    Q.queuesize=n;
    Q.incrementsize=QUEUEINCREMENT;
    Q.top=Q.rear=0;
}
void YangHui(int n)
{
    SqQueue Q;
    int i,k;
    for(i=1;i<=n;i++)
        cout<<" ";
    cout<<"1"<<endl;//在中心位置输出杨辉三角形的最顶端的1
    InitQueue(Q,n+2);//设置最大容量为n+2的空队列,且因为循环队列的创建队列的函数不含int型参数,所以定义调用了InitQueue()函数来创建空队列
    EnQueue_Sq(Q,0);//添加临界值0
    EnQueue_Sq(Q,1);
    EnQueue_Sq(Q,1);//第一行的值入队列

    k=1;//k表示行数
    QElemType e,s;
    while(k<n)
    {
        for(i=1;i<=n-k;i++)
            cout<<" ";
        EnQueue_Sq(Q,0);//行界值0入队
        do
        {
            DeQueue_Sq(Q,s);
            GetHead_Sq(Q,e);
            if(e)
                cout<<e<<" ";//若e为非0值,则打印输出e的值并加一空格
            else
                cout<<endl;//否则换行,为下一行的输出做准备
            EnQueue_Sq(Q,s+e);
        }while(e!=0);
        k++;
    }
    DeQueue_Sq(Q,e);
    QueueTraverse_Sq(Q);
}
int main()
{
    int n;
    printf("n=");
    scanf("%d",&n);
    YangHui(n);
    return 0;
}

循环队列的基本操作函数:

//在利用顺序分配存储结构实现队列时,除了用一维数组描述队列中的数据元素的存储区域,需设立两个指针Top,rear
//指示队头和队尾的位置,为叙述方便,在此约定:初始化建立空队列时,另top=rear=0,每当插入一个元素后,尾指针rear+1,
//每当删除一个元素时top+1,头指针始终指向队头元素,而尾指针始终指向队尾元素的“下一个”位置。

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
typedef int QElemType;
#define QUEUEINCREMENT 10
struct SqQueue
{
    QElemType *elem;
    int top;
    int rear;
    int queuesize;
    int incrementsize;
};
#define QUEUE_INIT_SIZE  100
void InitQueue_Sq(SqQueue &Q)
{
    Q.elem=new QElemType[QUEUE_INIT_SIZE+1];
    //为循环队列分配空间(比实际能用多一个元素)
    Q.queuesize=QUEUE_INIT_SIZE+1;
    Q.incrementsize=QUEUEINCREMENT;
    Q.top=Q.rear=0;
}
void EnQueue_Sq(SqQueue &Q,QElemType e)
{
    //插入元素e为Q的新的队尾元素
    if((Q.rear+1)%Q.queuesize==Q.top)//队满的判断
    {
        QElemType *a;
        a=new QElemType [Q.queuesize+Q.incrementsize];
        for(int k=0;k<Q.queuesize-1;k++)
            a[k]=Q.elem[(Q.top+k)%Q.queuesize];//腾挪原循环队列中的数据元素
        delete Q.elem;
        Q.elem=a;
        Q.top=0;
        Q.rear=Q.queuesize-1;
        Q.queuesize+=Q.incrementsize;
    }
    Q.elem[Q.rear]=e;
    Q.rear=(Q.rear+1)%Q.queuesize;//入队,rear表示真正队尾的下一个元素的下标

}
int QueueLength_Sq(SqQueue Q)
{
    return (Q.top+Q.queuesize-Q.rear)%Q.queuesize;
}
bool DeQueue_Sq(SqQueue &Q,QElemType &e)
{
    if(Q.top==Q.rear)
        return false;//空队列
    e=Q.elem[Q.top];
    Q.top=(Q.top+1)%Q.queuesize;
    return true;
}
void ClearQueue_Sq(SqQueue &Q)
{
    Q.top=Q.rear=0;
}
void DestroyQueue_Sq(SqQueue &Q)
{
    delete Q.elem;
    Q.elem=NULL;
    Q.top=Q.rear=0;
}
bool QueueEmpty_Sq(SqQueue Q)
{
    if(Q.top==Q.rear)
        return true;
    return false;
}
void GetHead_Sq(SqQueue Q,QElemType &e)
{
    e=Q.elem[Q.top];
}
void QueueTraverse_Sq(SqQueue Q)
{
    int i=Q.top;
    while(i!=Q.rear)
    {
        cout<<Q.elem[i]<<" ";
        i=(i+1)%Q.queuesize;
    }
    printf("\n");
}

该算法的时间复杂度为O(n*n),因为外循环的次数为n-1,内循环的次数分别为3,4,5,…………

    原文作者:杨辉三角问题
    原文地址: https://blog.csdn.net/j2013210855/article/details/40948091
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞