打印杨辉三角
- 运算基本思路:每一行不为1的数=上一行对应列的数+上一行前面一列的数
//*********************************************打印杨辉三角*******************************************************
#include <iostream>
using namespace std;
const int maxSize = 1e4; //定义一个循环队列的长度为1e4
struct QNode {
int Data[maxSize];
int front;
int rear;
};
typedef QNode* Queue; //定义指向QNode结构体的指针类型为Queue类型
void Init(Queue& q) //定义一个初始化队列的函数,把头指针和尾指针都指向0这个下标所对的位置
{
q = new QNode;
q->front = q->rear = 0;
}
bool Empty(Queue q) //判断是否为空,为空的条件是当头指针和尾指针指向同一个下标所对的区域时
{
return (q->front == q->rear);
}
bool EnQueue(Queue& q, int e) //进列函数,首先合法性判断,判断是否是满队列,若是则返回false.
{
if ((q->rear + 1) % maxSize == q->front)
return false;
q->Data[q->rear] = e;
q->rear = (q->rear + 1) % maxSize;
return true;
}
bool DeQueue(Queue& q, int& e) //出列函数,首先合法性判断,判断是否为空队列,若是返回flase.
{
if (q->front == q->rear)
return false;
e = q->Data[q->front];
q->front = (q->front + 1) % maxSize;
return true;
}
void Destroy(Queue& q)
{
delete q;
}
void YHtriangle(int level)
{
Queue q;
Init(q);
EnQueue(q, 1); //让第二行的第一个1进队列
EnQueue(q, 1); //让第二行的第二个1进队列
cout << 1<<'\n'; //直接打印第一行的1
int s = 0, t; //s作用:记录所对应那一行前面的数为多少,开始的时候,为0。t作用:作为中间的媒介变量
for (int i = 1; i <= level; i++)
{
EnQueue(q, 0); //作用:使得每一行两端的1都可以由0加上上一行的1得到。
for (int j = 1; j <= i + 2; j++)
{
DeQueue(q, t); //把队列首元素出来,为了计算出第二行的元素。
EnQueue(q, s + t);//将计算得到的第二行元素进队列
s = t; //作用:1、为了给s赋值。2、为了保存对应列前面那一个数为多少
if (j != i + 2) //当j=i+2时,s为0,这个时候s的作用是为了计算出下一行的1。所以不用输出s
{
cout << s << " ";
}
}
cout << '\n'; //在每一行的最后增加一个换行符
}
}
int main()
{
int level; //输入所求的层级
cout << "请输入你要求的杨辉三角的层数:" ;
cin >> level;
cout << endl;
cout << "结果得:"<<endl;
YHtriangle(level);
return 0;
}