杨辉三角在之前已经写过一种计算方法,利用结构体的拷贝,杨辉三角元素的求解仍然是利用两腰之和,当一个数取出与后面的数做加法,进栈,可以重复获得杨辉三角的值,不断进出,这样还能减少大量空间,数使用过就抛弃掉。为了获得数字两边的1,每一行计算都添加一个0,末尾也添加一个0,用于结束这一行的标志。但最后一行计算时只要出队即可。
#include<stdio.h>
#include <stdlib.h>
#include<stdbool.h>
typedef int ElemType;
typedef struct
{
ElemType* Base;
int front;
int rear;
int QueueSize;
int count;
}Queue;
typedef Queue* PQueue;
void InitQueue(PQueue Q, int size)//队列初始化
{
Q->Base = (ElemType*)malloc(sizeof(ElemType) * (size+1));
Q->front = 0;
Q->rear = 0;
Q->count = 0;
Q->QueueSize = size;
}
bool IsEmpty(PQueue Q)//判断队列是否为空
{
if (!Q->count) return true;
else return false;
}
bool IsFull(PQueue Q)//判断队列是否已满
{
if (Q->count>=Q->QueueSize) return true;
else return false;
}
bool EnQueue(PQueue Q, ElemType NewItem)//进队
{
if (!IsFull(Q)) { Q->Base[Q->rear] = NewItem; Q->rear = (Q->rear + 1) % Q->QueueSize; Q->count++; return true; }
else return false;
}
bool DeQueue(PQueue Q, ElemType* OutItem)//出队
{
if (!IsEmpty(Q)) { *OutItem = Q->Base[Q->front]; Q->front =( Q->front + 1) % Q->QueueSize; Q->count--; return true; }
else return false;
}
bool GetHead(PQueue Q, ElemType* RearItem)//获得队列头元素
{
if (!IsEmpty(Q)) *RearItem = Q->Base[Q->front];
else return false;
}
void YangHui(int n)
{
PQueue Q = (PQueue)malloc(sizeof(Queue));
int s=0, e=0;
InitQueue(Q, n + 2);
EnQueue(Q, 0);
EnQueue(Q, 1);
EnQueue(Q, 1);
int k = 1;
while (k < n)
{
for (int i = 1; i <= n - k; i++) printf(" ");
EnQueue(Q, 0);
do {
DeQueue(Q, &s);
GetHead(Q, &e);
if (e)printf("%d ", e);
else printf("\n");
EnQueue(Q, s + e);
} while (e != 0);
k++;
}
DeQueue(Q, &e);
while (!IsEmpty(Q))
{
DeQueue(Q, &e);
printf("%d ", e);
}
}
int main()
{
PQueue Q=(PQueue)malloc(sizeof(Queue));
int c;
InitQueue(Q, 10);
YangHui(6);
}