数据结构总结系列——循环队列之杨辉三角

Posted ever17

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构总结系列——循环队列之杨辉三角相关的知识,希望对你有一定的参考价值。

今天我们来写一个循环队列的应用哦!

解决的是杨辉三角问题~~

技术图片

对于这样一个上下多层之间有密切联系的数据,如果只是用数组和循环来解决的话,显然会浪费大量的空间和时间,

所以我们用队列来解决这一问题:

之所以选用循环队列也是因为它对于空间的利用是非常有效的,方便我们的工作:

开始定义结构体:

typedef struct //定义循环队列

    int data[MAXMIZE];
    int Front;
    int Rear;
RollQueue;

这里的最大值(MAXMIZE)大家可以用宏定义来自己定义想要的限制呦

关于循环队列,由于它没有浪费空间,所以非常有用的背后就是要多计算一点插入的位置:

技术图片

所以我们之后的判断条件会多一点~

队列相关函数的设置:

由于队列是一种只能从队尾插入,从队头删除的结构,因此简化了我们的操作:

void InitQueue(RollQueue &R)//队列初始化函数

    R.Front=R.Rear=0;//博主这里没有用指针,直接用了数组~


void InsertQueue(RollQueue &R,int Data)//插入队尾

    //首先判断是否满队列。
    if((R.Rear+1)%MAXMIZE==R.Front)//满队列条件
    
        cout << "This queue is full." << endl;
    
    else
    
        R.data[R.Rear]=Data;
        R.Rear=(R.Rear+1)%MAXMIZE;//success
    


int DeleteQueue(RollQueue &R,int &Re)//删除队头元素,用re返回

    if(R.Rear==R.Front)//判断是否队空
    
        cout << "This queue is empty." << endl;
        return 0;
    
    else
    
        Re=R.data[R.Front];
        R.Front=(R.Front+1)%MAXMIZE;
        return Re;
    

最后是杨辉三角的建立:

void YangHui(int n)

    RollQueue R;
    InitQueue(R);
    InsertQueue(R,1);//预先放入第一行的系数
    InsertQueue(R,1);//预先放入第一行的系数
    int s=0;
    for(int i=1;i<=n;i++)
    
        cout << endl;//这里换行鸭
        InsertQueue(R,0);//开头插入一个0用来进行第一次加法
        for(int j=1;j<=i+2;j++)//处理第i行的i+2个系数
        
            int t;
            DeleteQueue(R,t);
            InsertQueue(R,s+t);//这里把上一行的两个数据相加得到这一行的数据s
            s=t;
            if(j!=i+2)
            
                cout << s <<   ;
            
        
    

最后是整个程序:

#include <bits/stdc++.h>

using namespace std;
#define MAXMIZE 100

typedef struct //定义循环队列

    int data[MAXMIZE];
    int Front;
    int Rear;
RollQueue;

void InitQueue(RollQueue &R)//队列初始化函数

    R.Front=R.Rear=0;//博主这里没有用指针,直接用了数组~


void InsertQueue(RollQueue &R,int Data)//插入队尾

    //首先判断是否满队列。
    if((R.Rear+1)%MAXMIZE==R.Front)//满队列条件
    
        cout << "This queue is full." << endl;
    
    else
    
        R.data[R.Rear]=Data;
        R.Rear=(R.Rear+1)%MAXMIZE;//success
    


int DeleteQueue(RollQueue &R,int &Re)//删除队头元素,用re返回

    if(R.Rear==R.Front)//判断是否队空
    
        cout << "This queue is empty." << endl;
        return 0;
    
    else
    
        Re=R.data[R.Front];
        R.Front=(R.Front+1)%MAXMIZE;
        return Re;
    


void YangHui(int n)

    RollQueue R;
    InitQueue(R);
    InsertQueue(R,1);//预先放入第一行的系数
    InsertQueue(R,1);//预先放入第一行的系数
    int s=0;
    for(int i=1;i<=n;i++)
    
        cout << endl;//这里换行鸭
        InsertQueue(R,0);//开头插入一个0用来进行第一次加法
        for(int j=1;j<=i+2;j++)//处理第i行的i+2个系数
        
            int t;
            DeleteQueue(R,t);
            InsertQueue(R,s+t);//这里把上一行的两个数据相加得到这一行的数据s
            s=t;
            if(j!=i+2)
            
                cout << s <<   ;
            
        
    


int main()

    cout << "Input YangHui triangle n:" << endl;
    int n;
    cin>> n;
    YangHui(n);
    return 0;

那么我们的循环队列应用就讲到这里啦~~

 

 

技术图片

 

以上是关于数据结构总结系列——循环队列之杨辉三角的主要内容,如果未能解决你的问题,请参考以下文章

杨辉三角队列的实现 利用循环顺序队列打印杨辉三角。杨辉三角的特点是两个腰上的数字都为1,其它位置上的

数据结构学习笔记(栈队列)整理与总结

数据结构学习笔记(栈队列)整理与总结

课堂作业之杨辉三角形

用队列计算并打印杨辉三角的前8行 请高手来调试啊啊啊啊啊啊

用队列知识怎么实现输出杨辉三角?