最近在上数据结构与算法,期末老师要求同学抽问题,然后写这个算法问题的实验报告;其中就包含了用队列来实现杨辉三角形,这里就先提前练下手,万一运气好我就刚好抽到这个呢了(好了,不开玩笑了,进入正题吧)
算法思想:
首先先创建一个循环队列:
typedef struct sq
{
int a[MAXSIZE];//队列元素空间
int front,rear;//队头和队尾指针
}*SeqQue;
SeqQue InitQue()
{
SeqQue q;
q=(SeqQue)malloc(sizeof(sq));
if(q==NULL)
{
cout<<"创建循环队列失败!"<<endl;
return NULL;
}
q->front=q->rear=0;//设置队头和队尾指针初值为0
return q;
}
其次实现这个算法只需用到入队(在队尾入队)和出队(在队头出队)操作,但其中的细节还是要抓,比如:判断队列是否为空或已满
void enter(SeqQue q,int x)//入队函数
{
if((q->rear+1)%MAXSIZE==q->front)//判断队列是否已满
{
cout<<"循环队列已满!"<<endl;
return;
}
q->a[q->rear]=x;
q->rear=(q->rear+1)%MAXSIZE;//队尾指针加1
}
int OutQue(SeqQue q)//出队函数
{
int x;
if(q->rear==q->front)//判断队列是否为空
{
cout<<"循环队列已空"<<endl;
return 0;
}
x=q->a[q->front];//取出队头元素并返回
q->front=(q->front+1)%MAXSIZE;//队头指针加1
return x;
}
上面的队头和队尾指针有的博客可能不明白为什么要求模MAXSIZE,其实很简单,就是这是个循环队列,入队和出队函数运行了很多次,如果不求模MAXSIZE,队头和队尾指针可能就超过了MAXSIZE,并且求模后才是真正的队头和队尾指针。
下面才是这个算法的核心:
1>将第一行的元素1入队;
2>从第二行开始,现在的队头指向上一行,先将每行的固定元素1入队,然后循环操作求和过程:(将队首元素出队,并保存它的值为t1;获取当前队首的元素的值为t2,并进行x=t1+t2,且将x入队)
3>循环结束后,每行最后输出固定元素1,然后将x赋值为1,并将每行的最后一个固定元素1入队;
4>循环2、3步就可以输出杨辉三角形了。
核心代码如下:
SeqQue q;
int x=1,i;
cout<<"请输入杨辉三角形打印的行数:"<<endl;
cin>>i;
q=InitQue();//创建一个初始化循环队列
for(int n=0;n<i;n++)
{
for(int m=0;m<i-1-n;m++)
{
cout<<" ";
}
if(n==0)
{
cout<<1<<endl;
enter(q,x);
}
else
{
int t1=0,t2=0;//方便队首元素的保存和获取
for(int r=0;r<n;r++)
{
t1=t2;//保存上一个队首元素的值
t2=OutQue(q);//获取当前队首元素的值
x=t1+t2;//保证x是等于上一行它的左边元素和右边元素(位置)的和
enter(q,x);//将求和的值入队,用于下一行元素的计算
cout<<x<<" ";
}
cout<<1<<endl;
x=1;
enter(q,x);//将每行的最后一个固定元素1入队
}
}
其实你仔细调试代码后,就会发现每执行完一次大循环,循环队列中的元素就是对应的那一行元素的值:上一次循环队列的元素出队,当前对应的杨辉三角形这行元素入队。
AC代码如下:
#include <iostream>
using namespace std;
#define MAXSIZE 500
typedef struct sq
{
int a[MAXSIZE];
int front,rear;
}*SeqQue;
SeqQue InitQue()
{
SeqQue q;
q=(SeqQue)malloc(sizeof(sq));
if(q==NULL)
{
cout<<"创建循环队列失败!"<<endl;
return NULL;
}
q->front=q->rear=0;
return q;
}
void enter(SeqQue q,int x)
{
if((q->rear+1)%MAXSIZE==q->front)
{
cout<<"循环队列已满!"<<endl;
return;
}
q->a[q->rear]=x;
q->rear=(q->rear+1)%MAXSIZE;
}
int OutQue(SeqQue q)
{
int x;
if(q->rear==q->front)
{
cout<<"循环队列已空"<<endl;
return 0;
}
x=q->a[q->front];
q->front=(q->front+1)%MAXSIZE;
return x;
}
int main()
{
SeqQue q;
int x=1,i;
cout<<"请输入杨辉三角形打印的行数:"<<endl;
cin>>i;
q=InitQue();
for(int n=0;n<i;n++)
{
for(int m=0;m<i-1-n;m++)
{
cout<<" ";
}
if(n==0)
{
cout<<1<<endl;
enter(q,x);
}
else
{
int t1=0,t2=0;
for(int r=0;r<n;r++)
{
t1=t2;
t2=OutQue(q);
x=t1+t2;
enter(q,x);
cout<<x<<" ";
}
cout<<1<<endl;
x=1;
enter(q,x);
}
}
return 0;
}
最后我觉得我的数据结构老师这学期讲不完这门课了,可以请各位大佬出些关于算法的干货吗 嘻嘻。。。