今天我们来写一个循环队列的应用哦!
解决的是杨辉三角问题~~
对于这样一个上下多层之间有密切联系的数据,如果只是用数组和循环来解决的话,显然会浪费大量的空间和时间,
所以我们用队列来解决这一问题:
之所以选用循环队列也是因为它对于空间的利用是非常有效的,方便我们的工作:
开始定义结构体:
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 << ' ' ; } } }}
最后是整个程序:
#includeusing 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;}
那么我们的循环队列应用就讲到这里啦~~