用循环队的方式处理杨辉三角形问题(C++)
#include <iostream>
#include<malloc.h>
using namespace std;
const int MAX=100;
//循环队列
typedef struct
{
int data[MAX];
int front; //头指针
int rear; //尾指针
} SeqQueue;
//初始化循环队列
void InitQueue(SeqQueue *&q)
{
q=(SeqQueue *)malloc(sizeof(SeqQueue));
q->front = q->rear = 0;
}
//入队
bool EnterQueue(SeqQueue *q, int x)
{
if ((q->rear+1)%MAX==q->front)
return false;
q->data[q->rear]=x;
q->rear=(q->rear+1)%MAX;
return true;
}
//出队
bool DeleteQueue(SeqQueue *q,int &x)
{
if (q->front==q->rear)
return false;
x=q->data[q->front];
q->front=(q->front+1)%MAX;
return true;
}
//取对头元素
bool GetHead(SeqQueue *q,int &x)
{
if (q->front==q->rear)
return false;
x=q->data[q->front];
return true;
}
//判断队列是否为空
int IsEmpty(SeqQueue *q)
{
if(q->front==q->rear)
return true;
return false;
}
//打印杨辉三角
void YangHuiTriangle(int N)
{
SeqQueue *q;
InitQueue(q);
int n,i,x,temp;
EnterQueue(q,1); //第一行元素入队
for (n=2;n<=N;n++)
{
EnterQueue(q,1); //第n行第一个元素入队
for (i=1;i<=n-2;i++)
{ //利用队中第n-1行元素产生第n行的中间n-2个元素并入队
DeleteQueue(q,temp); //出队元素赋给temp
cout<<temp; //打印第n-1行的元素
GetHead(q,x);
temp=temp+x; //利用第n-1行元素产生第n行元素
EnterQueue(q,temp); //可以利用画图理解/
}
DeleteQueue(q,x);
cout<<x; //打印n-1行最后一个元素
EnterQueue(q,1);
cout<<endl;
}
while (!IsEmpty(q)) { //打印最后一行
DeleteQueue(q,x);
cout<<x;
}
}
int main() {
int N;
cout<<"请输入想打印的行数:"<<endl;
cin>>N;
YangHuiTriangle(N);
cout<<endl;
return 0;
}
输入:5
输出:
1
11
121
1331
14641
请输入想打印的行数:
5
1
11
121
1331
14641
--------------------------------
Process exited after 2.028 seconds with return value 0
请按任意键继续. . .