队列基本操作以及用队列实现杨辉三角

杨辉三角在之前已经写过一种计算方法,利用结构体的拷贝,杨辉三角元素的求解仍然是利用两腰之和,当一个数取出与后面的数做加法,进栈,可以重复获得杨辉三角的值,不断进出,这样还能减少大量空间,数使用过就抛弃掉。为了获得数字两边的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);

}
上一篇:数据结构线性表——顺序表


下一篇:浙江大学数据结构:02-线性结构4 Pop Sequence (25分)