博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构总结系列(四)——循环队列之杨辉三角
阅读量:5045 次
发布时间:2019-06-12

本文共 2896 字,大约阅读时间需要 9 分钟。

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

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

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

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

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

开始定义结构体:

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 
using namespace std;#define MAXMIZE 100typedef 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;}

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

 

 

 

转载于:https://www.cnblogs.com/ever17/p/10962794.html

你可能感兴趣的文章
Centos6.4安装JDK
查看>>
201521123069 《Java程序设计》 第4周学习总结
查看>>
线性表的顺序存储——线性表的本质和操作
查看>>
【linux】重置fedora root密码
查看>>
用swing做一个简单的正则验证工具
查看>>
百度坐标(BD-09)、国测局坐标(火星坐标,GCJ-02)和WGS-84坐标互转
查看>>
pig自定义UDF
查看>>
输入名字显示其生日,没有则让输入生日,做记录
查看>>
爬虫综合大作业
查看>>
Kubernetes 运维学习笔记
查看>>
并查集 经典 畅通工程
查看>>
Spark MLlib 之 Naive Bayes
查看>>
php修改SESSION的有效生存时间
查看>>
spring security 11种过滤器介绍
查看>>
Hibernate一对多、多对一关联
查看>>
一、记录Git使用中遇到的问题及解决方法
查看>>
学习网址
查看>>
前端表格插件datatables
查看>>
内部类
查看>>
树链剖分入门
查看>>