シリーズ概要データ構造(D) - パスカルの三角形の循環キュー

今日は、アプリケーションにああの循環キューを書きます!

パスカルの三角形は、問題を解決するためにある~~

データのための上部及び下部との間の密接な関係を持っているような多層、問題を解決するためにループ配列を有する場合にのみと、明らか空間と多くの時間を浪費し、

だから我々はこの問題を解決するためにキューを使用します。

それは循環キューが私たちの仕事を容易にするためのスペースを使用し、非常に有効であるであるため、選択しました:

構造を定義する起動します。

typedefは構造体 // 円形のキューを定義する
{
     int型、データ[maxmize]
     int型のフロントと、
     int型リア; 
} 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;
}

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

 

 

 

おすすめ

転載: www.cnblogs.com/ever17/p/10962794.html
おすすめ