数据结构总结系列(四)——循环队列之杨辉三角

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

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

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

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

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

开始定义结构体:

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

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

原文地址:https://www.cnblogs.com/ever17/p/10962794.html

时间: 2024-10-24 18:07:00

数据结构总结系列(四)——循环队列之杨辉三角的相关文章

用队列打印杨辉三角

#include<iostream> #include<cstdio> #include<queue> #include<algorithm> using namespace std; queue<int> Q; int temp; void tringle(const int n) { Q.push(1); for(int i=2;i<=n;i++) { Q.push(1); for(int j=1;j<=i-2;j++) { te

使用队列求解杨辉三角的第K层的所有元素

Java代码   package queue; import java.util.concurrent.ConcurrentLinkedDeque; /** * Created by Lanxiaowei * Craated on 2016/12/12 9:03 * 求解杨辉三角的第K层的所有元素 * 使用队列求解 */ public class YHTriangleWithQueue { public static void main(String[] args) throws Interru

yhTriangle_LinkQueue(队列实现杨辉三角)

#include"LinkQueue.h" void yhTriangle(int n) { LinkQueue<int> A; int s,t; A.Inqueue(1);A.Inqueue(1); cout<<1<<endl; cout<<1<<"\t"<<1<<endl; for(int i=3;i<=n;i++) { A.Inqueue(1); A.Outqueue(s

数据结构上机4队列-杨辉三角2

#include <stdio.h> #include <malloc.h> #define OK 1 #define OVERFLOW -1 #define ERROR 0 typedef int Status, QElemType; //队列结构定义 typedef struct { QElemType *base; int front; int rear; } SqQueue; //初始化队列 Status InitQueue(SqQueue *Q, int Qsize) {

数据结构上机4队列-杨辉三角1

#include <stdio.h> #include <malloc.h> #define OK 1 #define OVERFLOW -1 #define ERROR 0 typedef int Status, QElemType; typedef struct { QElemType *base; int front; int rear; } SqQueue; Status InitQueue(SqQueue *Q, int Qsize) { Q->base = (QE

杨辉三角——队列的应用

杨辉三角形是形如: 1 1   1 1   2   1 1   3   3   1 1   4   6   4   1 的三角形,其实质是二项式(a+b)的n次方展开后各项的系数排成的三角形,它的特点是左右两边全是1,从第二行起,中间的每一个数是上一行里相邻两个数之和. 使用<队列>的思想来实现杨辉三角的流程: 1>首先,需要初始化一个队列,即对头=队尾=0: 2>将第一行的元素1入队,接着操作第二行(一二行不需要求和操作,直接将元素入队即可): 3>从第三行开始,现在的对头

采用两个一维数组输出等腰三角形的杨辉三角

代码如下: package 杨辉三角; import java.util.Scanner; public class 杨辉三角0 { public static void main(String[] args) { Scanner a = new Scanner(System.in); System.out.print("输入杨辉三角的行数n:"); int n=a.nextInt(); int[] b=new int[100]; //创建整形数组,最大可存放100个整形 int[]

Python 中使用 for、while 循环打印杨辉三角练习(列表索引练习)。

Python中使用for while循环打印杨辉三角练习(列表索引练习). 杨辉三角是一个由数字排列成的三角形数表,一般形式如下: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 ....................... 杨辉三角最本质的特征是,它的两条斜边都是由数字1组成的,而其余的数则是等于它肩上的两个数之和. 方法一: __author__ = 'Brad' n = int(input('请输入你想打印杨辉三角

算法练习四:打印杨辉三角

规律:1.第n层的总和等于2的n次幂:     2. 从第三层开始数字等于它上方的两个数字之和:     3.每一行的长度等于 n ,循环 n 次: function text(n){ var arr = []; //结果 var arr1 = []; //中转 //生成杨辉三角数据 for (var i = 1; i <= n; i++) { arr1 = [1]; //第一个值为"1" for(var j = 1; j < i; j++){ if(j == i-1){