总的思路 . 通过 n-1行 来得到 下一行(n行)的数据并将 入队,与此同时将 n-1 数据出队;
第一步:构造第 —行的数据;
第一步:如何得到下一行的数据?
结合杨辉三角的自身特性:1, 第一行
1 1 第二行
1 2 1 第三行
1 3 3 1 第四行
1 4 6 4 1 第五行
················
观察可得:如第 4 行 第 2 个数由第 三 行的 第2个与第1个得到,第 3 个数可由第三行的 第3个与第2个数得到, 依此类推
第四行第 n 个 可由第三行的第 n-1个与 第n个得到。因此, 在n-1 行 出队时,需要 记录 前一个数;可能会问第一怎么得到, 因为第 1 个数前一个没有数, 只需将 用来记录前一个数的变量置零就好。通过这样就可以得到第n行的前n-1个数,还差最后一个数,因为每一行最后一个数固定为1,所以将1入队;
用队列打印杨辉三角c
#include<stdio.h>
#define MAX 100
struct queue{
int a[MAX];
int front;
int rear;
};
int main(void)
{
struct queue xh;
int n, i, j, a, b;
xh.rear = xh.front = 0; /* 对队列进行初始化,这里不一定赋值0,只要在数组内,但要保证头尾指向一致*/
scanf("%d", &n);
xh.a[xh.rear] = 1;
xh.rear = (xh.rear + 1) % MAX; /*构造第一行数据*/
for(i=1; i<=n; i++)
{
a = 0; /* 记录其前一个数 */
for(j=0; j<i; j++)
{
if ((xh.rear + 1)%MAX != xh.front)
{
b = xh.a[xh.front];
xh.front = (xh.front + 1) % MAX;
printf("%d ", b); /* 打印第 i 行的数据*/
xh.a[xh.rear] = b+a;
xh.rear = (xh.rear + 1) % MAX; /*创建 i+1 行的数据,并入队 */
a = b;
}
}
xh.a[xh.rear] = 1;
xh.rear = (xh.rear + 1) % MAX;
printf("\n");
}
return 0;
}