c++用结构体结合循环队列来实现杨辉三角形

问题描述:
设计一个程序,输入一个数n,然后输出n行杨辉三角形。

简介:
杨辉三角,是二项式系数在三角形中的一种几何排列。在欧洲,这个表叫做帕斯卡三角形。帕斯卡是在1654年发现这一规律的,比杨辉要迟393年,比贾宪迟600年。杨辉三角是中国古代数学的杰出研究成果之一,它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的数与形的结合。

杨辉三角的特点:
1.每个数等于它上方两数之和。
2.每行数字左右对称,由1开始逐渐变大。
3.第n行的数字有n项。

杨辉三角形如下:
ttps://img-blog.csdnimg.cn/20200514193224256.png)

这里我们用c++的结构体结合循环队列来进行编译:

定义结构体:

typedef int QElemType;

typedef struct SqQueue   //定义结构体SqQueue
{
 QElemType *base;
 int front; //前一个
 int rear;  //后一个
}SqQueue;

c++代码实现:

#include <iostream>
#include <stdlib.h>
using namespace std;

# define MAXQSIZE 100
# define TRUE 1
# define FALSE 0
# define ERROR 0

循环队列的各功能:

int EnQueue(SqQueue &Q,QElemType e) //往循环队列添加数据
{
 if((Q.rear+1)%MAXQSIZE==Q.front)
 {
  cout<<"错误!!!队列中已满 ! ";
  return ERROR;
 }
 Q.base[Q.rear]=e;
 Q.rear=(Q.rear+1) % MAXQSIZE;
 return OK;
}


int DeQueue(SqQueue &Q,QElemType &e) //往循环队列删除数据
{
 if(Q.front==Q.rear)
 {
  cout<<endl<<"错误!!! 队列为空!";
  return (ERROR);
 }
 e=Q.base[Q.front];
 Q.front=(Q.front+1)%MAXQSIZE;
 return e;
} 


int InitQueue(SqQueue &Q) //创建循环列表
{
 Q.base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
 if(!Q.base)//判断是否创建成功
 {
  cout<<endl<<"错误!!! 创建失败! ";
  return ERROR;
 }
 Q.front=Q.rear=0;
 return TRUE;
} 


int DestroyQueue(SqQueue &Q)//销毁队列
{
 if(Q.base)
  free(Q.base);
 Q.base=NULL;
 Q.front=Q.rear=0; //空队列的标志是队头队尾指针都相同,且为0
 return TRUE;
}


int IsEmpty(SqQueue &Q)//判断循环队列是否为空
{
 if(Q.front == Q.rear)
  return TRUE;
 else
  return FALSE;
}



int GetHead(SqQueue Q, QElemType &p) //取循环队列队首元素
{
 if(Q.front == Q.rear)
  return FALSE;
 else
 {
  p = Q.base[Q.front];
  return TRUE;
 }
}

主要算法实现:

void YangHuie(int sum)
{
 int n,i;
 QElemType temp;
 QElemType p;
 SqQueue Q;
 InitQueue(Q);
 EnQueue(Q, 1);             //第一行元素入队
 for(n = 2; n <= sum; n++)        //产生第n行元素并入队,同时打印第n - 1 行的元素
 {
  EnQueue(Q, 1);         //第n行的第一个元素入队
  for(i = 1; i <= n-2; i++)  //利用队中第n-1行元素产生第n行的中间n-2个元素并入对
  {
   DeQueue(Q,temp);
   cout<<temp;    //打印第n-1行的元素
   GetHead(Q, p);
   temp = temp + p;       //利用队中第n-1行元素产生第n行元素
   EnQueue(Q, temp);
  }
  DeQueue(Q, p);
  cout<<p;          //打印第n-1行元素的最后一个元素
  cout<<"\n";
  EnQueue(Q, 1);          //第n行的最后一个元素入队
 }

 while(!IsEmpty(Q))             //打印最后一行元素
 {
  DeQueue(Q, p);
  cout<<p;
 }
cout<<"\n";
}

主函数main:

int main()
{
  int n;
  cout<<"请输入需要打印的行数:"<<"\n";
  cin>>n;
  cout<<"\n";
  YangHui(n);
  getchar();
}

代码运行结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200514201723129.png

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值