數據結構總結系列(四)——循環隊列之楊輝三角


今天我們來寫一個循環隊列的應用哦!

解決的是楊輝三角問題~~

對於這樣一個上下多層之間有密切聯系的數據,如果只是用數組和循環來解決的話,顯然會浪費大量的空間和時間,

所以我們用隊列來解決這一問題:

之所以選用循環隊列也是因為它對於空間的利用是非常有效的,方便我們的工作:

開始定義結構體:

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

那么我們的循環隊列應用就講到這里啦~~

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM