打印杨辉三角
- 杨辉三角是比较常见的队列的应用,下面一行的数是上面2个数字的和,数列首位都是1,高中数学里牛顿二项式展开式应该有说。
代码收获
- 这题主要是找规律。利用下面一行比上面一行数字多一个,队列头为上一行,除了入队首尾的1之外,入队的上一行2个数的和等于新入队的元素,每入一次出一个上一行元素。
- 分开讨论第3行以下和第3行及第三行后的。
队列归档
#include<stdio.h>
#include<stdlib.h>
# define MAXSIZE 100
typedef struct que{
int ele[MAXSIZE];
int front,rear;
}quene,*quenep;
void InitialStack(quenep* QE){
*QE=(quenep)malloc(sizeof(quene));
(*QE)->rear=0;
(*QE)->front=0;//2指针相等代表空
}
int PushQuene(quenep QE,int x){
if((QE->rear+1)%MAXSIZE==QE->front){
printf("队列满\n");
return 1;
}else{
QE->ele[QE->rear]=x;
QE->rear=(QE->rear+1)%MAXSIZE;//入队列就是尾指针等于赋值的数,尾指针加一余上总大小
return 0;
}
}
int PopQuene(quenep QE,int*x){
if(QE->front==QE->rear){
printf("队列空\n"); return 1;
}else{
*x = QE->ele[QE->front];
QE->front=(QE->front+1)%MAXSIZE;//出队列和入队列一样
return 0;
}
}
void Printquene(quenep QE){
int sa;
printf("队列里有\n");
for(sa=QE->front;sa!=QE->rear;sa=(sa+1)%MAXSIZE){
printf("%d",QE->ele[sa]);
}
}
void yanghuitriangle(quenep QE){
printf("输入需要输出几行\n");
int num,rec=2,nei;
scanf("%d",&num);
getchar();
PushQuene(QE,1);
for(;rec<=num+2;rec++){//如果生成5行,必须循环到第7行
PushQuene(QE,1);
if(rec-2>0){//从第三行开始
for(nei=1;nei<=rec-2;nei++){//看需要生成几个数,从第三行有第一个数生成
int new;
int x;
new=QE->ele[QE->front]+QE->ele[QE->front+1];//上一层2数合
PopQuene(QE,&x);
printf("%d",x);
PushQuene(QE,new);
}
int x3;
PopQuene(QE,&x3);
printf("%d",x3);
PushQuene(QE,1);
printf("\n");
}else{//第二行,把第一行的1出掉
int x2;
PushQuene(QE,1);
PopQuene(QE,&x2);
printf("%d",x2);
printf("\n");
}
}
}
void main(){
quenep QE;
InitialStack(&QE);
yanghuitriangle(QE);
Printquene(QE);
}
输入需要输出几行
9
9
1
11
121
1331
14641
15101051
1615201561
172135352171
18285670562881
193684126126843691
队列里有
1104512021025221012045101
Process finished with exit code 66