用两个队列完成杨辉三角的输出:
思路:
队列一:
0 | 1 | 0 |
队列二:
0 | 1 | 1 | 0 |
队列一中的元素,两个相连的进行相加就可以得到第下一行中的需要打印的元素,例如:第一行键盘输入0 1 0;第二行我需要打印 1 1, 1 1就可以通过(0+1)和(1+0)运算获得。但是我如果需要通过运算得到第三行的数据,我需要在第二行的1 1 的首尾各加上一个0,变成 0 1 1 0,这样子我才能通过两个相连相加获得第三行的元素,就是 1 2 1;由此就可以总结出规律:
当我将当前一行的元素两两相连相加时,我就能获得下一行的数据,同时我要在这段数据的前后插入一个0。
下面是代码实现:
头文件:
#ifndef _DUILIE_H //头文件部分,和普通顺序队列没区别
#define _DUILIE_H
#define SUCCESS 10000
#define FAILURE 10001
#define TRUE 10002
#define FALSE 10003
#define SIZE 1000
struct queue
{
int data[SIZE];
int front;
int rear;
};
typedef struct queue Queue;
int init(Queue *q);
int empty(Queue q);
int insert(Queue *q, int e);
int getfront(Queue q);
int outfront(Queue *q);
int length(Queue q);
#endif
主函数:
#include "duilie.h" //一开始都要进行的操作:初始化,判断是否为空,然后插入
#include <stdio.h>
int main()
{
int ret, i, d, j,g;
Queue queue;
Queue queue1;
Queue queue2;
ret = init(&queue1);
ret = init(&queue);
if(ret == SUCCESS)
{
printf("init success!\n");
}
else
{
printf("init failure!\n");
}
ret = empty(queue);
if(ret == FALSE)
{
printf("queue is not empty!\n");
}
else
{
printf("queue is empty!\n");
}
for(i = 0; i < 3; i++)
{
scanf("%d",&d);
ret = insert(&queue,d);
if(ret == SUCCESS)
{
printf("insert %d success!\n", d);
}
else
{
printf("insert %d failure!\n",d);
}
}
ret = bianli(queue);
for(i = 0; i < 5; i++) //核心代码部分:
{ //先确定输出几行杨辉三角
insert(&queue1,0); //然后就是出队去,取队头元素,相加,插入
for(j = 0; j < i + 2; j++)
{
g = outfront(&queue) + getfront(queue);
insert(&queue1,g);
printf("%d ",g);
}
printf("\n");
insert(&queue1,0);
queue2 = queue; //最后交换队列1 和队列2,然后清空队列2
queue = queue1; //在我的代码中,队列1是queue,队列2是queue2
queue1 = queue2;
clear(&queue1);
}
return 0;
}
子函数功能封装:
#include "duilie.h"
#include <stdio.h>
#include <stdlib.h>
int init(Queue *q)
{
if(NULL == q)
{
return FAILURE;
}
q->rear = q->front = 0;
return SUCCESS;
}
int empty(Queue q)
{
return (q.front == q.front)?TRUE:FALSE;
}
int insert(Queue *q, int e)
{
if(NULL == q)
{
return FAILURE;
}
if((q->rear + 1) % SIZE == q->front)
{
return FAILURE;
}
q->data[q->rear] = e;
q->rear = (q->rear + 1) % SIZE;
return SUCCESS;
}
int getfront(Queue q)
{
if(q.front == q.rear)
{
return FAILURE;
}
return q.data[q.front];
}
int outfront(Queue *q)
{
int e;
if(NULL == q || q->front == q->rear)
{
return FAILURE;
}
e = q->data[q->front];
q->front = (q->front + 1) % SIZE;
return e;
}
int length(Queue q)
{
return (q.rear - q.front + SIZE) % SIZE;
}
int clear(Queue *q)
{
if(q == NULL)
{
return FAILURE;
}
q->front = q->rear;
return SUCCESS;
}
void bianli(Queue q)
{
int i;
for(i = q.front; i != q.rear; i++)
{
if(q.data[i] != 0)
{
printf("%d \n", q.data[i]);
}
}
}
程序运行结果显示: