今天我們來寫一個循環隊列的應用哦!
解決的是楊輝三角問題~~
對於這樣一個上下多層之間有密切聯系的數據,如果只是用數組和循環來解決的話,顯然會浪費大量的空間和時間,
所以我們用隊列來解決這一問題:
之所以選用循環隊列也是因為它對於空間的利用是非常有效的,方便我們的工作:
開始定義結構體:
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; }
那么我們的循環隊列應用就講到這里啦~~