zoukankan      html  css  js  c++  java
  • 数据结构总结系列(四)——循环队列之杨辉三角

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

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

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

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

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

    开始定义结构体:

    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;
    }

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

  • 相关阅读:
    synchronized锁机制 之 代码块锁(转)
    执行mvn 报错 source-1.5 中不支持 diamond运算符
    Git常用命令及场景
    mysql数据库导入与导出
    Linux磁盘空间分析及清理(df、du、rm)
    IIs配置文件存放路径
    解决SQLite database is locked
    C#测试web服务是否可用
    Jquery easyui-combobox 的一个BUG
    iframe自适应方法
  • 原文地址:https://www.cnblogs.com/ever17/p/10962794.html
Copyright © 2011-2022 走看看