数据结构——队列
1.顺序存储来定义循环队列结构。编程实现,初始化队列、判队列为空、出队列、入队列、求队列头部元素等运算
2.利用队列打印杨辉三角形。杨辉三角形是形如:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
的三角形,其实质是二项式(a+b)的n次方展开后各项的系数排成的三角形,它的特点是左右两边全是1,从第二行起,中间的每一个数是上一行里相邻两个数之和。输入要打印的层数n,打印出相应的杨辉三角形。
#define MAXSIZE 1000
typedef struct {
int data[MAXSIZE];
int front,rear;
}Sequeue;
void SequeueInit(Sequeue &Top){//队列的初始化
Top.front=0;
Top.rear=0;
}
void SequeueEmpty(Sequeue &Top){//判队列为空
if(Top.rear==Top.front)
{
printf("队列为空\n");
}
else printf("队列不为空\n");
}
void SequeuePush(Sequeue &Top,int m){//循环入队列
if((Top.rear+1)%MAXSIZE==Top.front)
{printf("队列已满");}
else{
Top.data[Top.rear]=m;
printf("%d已入队\n",m);
Top.rear=(Top.rear+1)%MAXSIZE;}
}
void SequeueTop(Sequeue &Top)//求队列头部元素
{
printf("队列头部元素为%d\n",Top.data[Top.front]);
}
void SequeuePop(Sequeue &Top){//循环出队列
int i=0;
if(Top.rear==Top.front)
{printf("队列为空");}
else{
while (Top.rear!=Top.front) {
i++;
printf("队第%d元素为%d\n",i,Top.data[Top.front]);
Top.front=(Top.front+1)%MAXSIZE;
}
}
}
int SequeueTopp(Sequeue &Top)//求队列头部元素( 返回值)
{
return Top.data[Top.front];
}
void SequeuePushh(Sequeue &Top,int m){//不循环入队列
Top.data[Top.rear]=m;
Top.rear++;
}
int SequeuePopp(Sequeue &Top){//不循环出队列
int m=Top.data[Top.front];
Top.front++;
return m;
}
void YangHuiTriangle() {
/*
1. 首先让0和1入队成为第一行。
2. 对于余下的每行,先让0入队
3. 每次先出一个元素和队首元素相加,总和入队。
*/
Sequeue Q;
SequeueInit(Q);
printf("输入杨辉三角中你想要的行数:");
int n;
scanf("%d",&n);//必须要分开写:int N=scanf("%d",&N);scanf返回的是正确输入的参数的个数
SequeuePushh(Q,0);
SequeuePushh(Q,1);
printf("%d\n", 1);
for (int i=1; i<n; i++)
{
SequeuePushh(Q,0);//每一行输入完补一个0,使下一行第一个为1
for (int j=0; j<=i; j++)
{
int v = SequeuePopp(Q);
v=v+SequeueTopp(Q);
SequeuePushh(Q,v);
printf("%d ",v);
}
printf("\n");
}
}
int main()
{
//队列
printf("下面是队列\n\n");
Sequeue M;
SequeueInit(M);
SequeueEmpty(M);
SequeuePush(M,3);
SequeueEmpty(M);
SequeuePush(M,4);
SequeuePush(M,5);
SequeueTop(M);
SequeuePop(M);
YangHuiTriangle();
printf("\n\n");
}