#include "stdio.h"
#define maxsize 100
/*--------循环队列及操作如下------------ */
typedef int DataType;
typedef struct node{
DataType data[maxsize]; /*循环队列的存储空间 */
int front,rear; /*一个队头,队尾指针 */
}seqQueue;
void InitQueue(seqQueue *sq){ /*初始化循环队列*/
sq->front=0;
sq->rear=0;
}
int LenghtQueue(seqQueue sq){ /*计算队列的长度 */
return (sq.rear-sq.front+maxsize)%maxsize;
}
int IsEmpty(seqQueue sq){ /*判断队列是否为空 */
if(sq.rear==sq.front)
return 1; /*为空 */
else
return 0; /*不为空 */
}
void EnQueue(seqQueue *sq,DataType e){ /*进队 */
if((sq->rear+1)%maxsize==sq->front){
printf("插入错误!队满不能插入\n");
return ;}
sq->data[sq->rear]=e;
sq->rear=(sq->rear+1)%maxsize;
}
void DeQueue(seqQueue *sq,DataType *e){ /*出队 */
if(sq->rear==sq->front){
printf("队列为空,出队错误!");
return ;}
*e=sq->data[sq->front];
sq->front=(sq->front+1)%maxsize;
}
void GetFront(seqQueue sq,DataType *e){ /*获取队头元素 */
*e=sq.data[sq.front];
}
/*------------定义结束--------------------------------- */
/*---------------该函数为测试队列----------------------*/
void TesQueue(){
int a[4]={1,2,3,4};
int x,z,m; int i;
seqQueue sq;
InitQueue( &sq);
for(i=0;i<4;i++)
EnQueue(&sq,a[i]);
for( i=0;i<4;i++) {
DeQueue(&sq,&x);
printf("%5d",x);
}
z= IsEmpty(sq); printf("\n%5d",z);
scanf("%d",z);
}
/*----------测试队列函数结束-------------------------*/
/*-----------打印杨辉三角形------------------------------*/
void YANGHUI(int n){
/*也就是打印(a+b)的n次方展开的系数*/
//添加第一行我是从二叉树的层次遍历中仿出来的
//二叉树只要提供一个根节点就可以根据访问所有的节点
int i,j,k; int s,t,e;
seqQueue sq; InitQueue(&sq); //假设开始的一行的元素为1
s=1; EnQueue(&sq,0); //人为的为每一行添加一个0
EnQueue(&sq,1); //该行不打印出来
for(i=1;i<=n;i++){
EnQueue(&sq,0); /*每一行的开始都人为的添加一个0*/
printf("\n");
for(k=1;k<=n-i;k++)
printf(" ");
for(j=1;j<=i+1;j++){
DeQueue(&sq,&t); /*删除队头元素,*/
GetFront(sq,&s);
printf("%4d",s+t);
EnQueue(&sq,s+t); //插入队列的元素为前2个栈元素之和
}
printf("\t\t%d",LenghtQueue(sq)); //输出每行时队列的长度
}
printf("\n");
}
/*-----------------杨辉三角形结束----------------------*/
/*--------------------main-----------------------*/
void main(){
int n;
printf("请输入一个正整数:\n\t\t");
scanf("%d",&n);
YANGHUI(n);
}