数据结构复习---------队列打印杨辉三角

用队列实现打印杨辉三角


问题介绍:
如果将二项式(a+b)^i(i=2,3,4……)展开,其系数排列成杨辉三角,如何实现各行系数的前n行打印出来,如下所示:

                              0    1    1    0        i=1
                            0   1    2    1    0      i=2
                          0  1     3    3    1   0    i=3
                        0  1    4     6    4   1   0  i=4
                                     ...              i=...

问题分析:
杨辉三角从外形上有个很重要的特征——三角中的任意一个系数值(第一行除外)可以看成一个其肩膀上的两个系数之和;对于某一边侧肩膀上没有的系数地方,可以看作此处有个默认值0。因此求任意一行i(i>=2)的系数值时,可以由i-1行的系数值来获得,借助一个辅助的数据结构队列,事先将上一行的系数值入队列,包括默认的行末尾的系数0(行首默认的系数0预存在一个变量s中),利用出队列运算,每出一个系数t,利用他的值和前面刚出队列的系数值s之和得到下一行相应位置的系数值,并把刚得到的系数值入队列,并把t值赋给s,循环下去,可以得到所需指定行数的杨辉三角。具体算法如下。
算法:

void Yanghui_triangle(int n){

    int s = 0;
    int i;
    PSeqQueue sq = Init_SeqQueue();
    In_SeqQueue(sq,1);
    In_SeqQueue(sq,1);
    for (i = 1; i <= n; i++,s=0){
        printf("\n");
      for ( int k = 0; k<=40-4*i; k+=2)//输出格式控制
          printf(" ");

      In_SeqQueue(sq,0);
      for (int j = 1; j <= i + 2;j++){
          int  t;
          Out_SeqQueue(sq,&t);
          In_SeqQueue(sq,s+t);
          s = t;
          if (j != i + 2)
          {
              printf("%4d",s);
          }
      }
    }
      putchar('\n');
      Destroy_SeqQueue(&sq);
}

完整代码实现:

#include
#include
#define MAXSIZE 100
typedef struct{
    int data[MAXSIZE];
    int front, rear;
}SeqQueue,*PSeqQueue;
PSeqQueue Init_SeqQueue(){

    PSeqQueue Q;
    Q = (PSeqQueue)malloc(sizeof(SeqQueue));
    if (Q){

        Q->front = 0;
        Q->rear = 0;
    }
    return Q;
}
int Empty_SeqQueue(PSeqQueue Q){
    if (Q&&Q->front == Q->rear)
        return 1;
    else
    {
        return 0;
    }
}
int In_SeqQueue(PSeqQueue Q,int x){
    if ((Q->rear + 1) % MAXSIZE == Q->front)
    {
        printf("队满");
        return -1;
    }
    else
    {
        Q->rear = (Q->rear + 1) % MAXSIZE;
        Q->data[Q->rear] = x;
    }
    return 1;
}
int Out_SeqQueue(PSeqQueue Q,int *x){

    if (Empty_SeqQueue(Q)){

        printf("队空");
        return -1;
    }
    else
    {
        Q->front = (Q->front + 1) % MAXSIZE;
        *x = Q->data[Q->front]; 
        return 1;
    }

}
void Destroy_SeqQueue(PSeqQueue *Q){

    if (*Q){

        free(*Q);
    }
    *Q = NULL;
}
void Yanghui_triangle(int n){

    int s = 0;
    int i;
    PSeqQueue sq = Init_SeqQueue();
    In_SeqQueue(sq,1);
    In_SeqQueue(sq,1);
    for (i = 1; i <= n; i++,s=0){
        printf("\n");
      for ( int k = 0; k<=40-4*i; k+=2)
          printf(" ");

      In_SeqQueue(sq,0);
      for (int j = 1; j <= i + 2;j++){
          int  t;
          Out_SeqQueue(sq,&t);
          In_SeqQueue(sq,s+t);
          s = t;
          if (j != i + 2)
          {
              printf("%4d",s);
          }
      }
    }
      putchar('\n');
      Destroy_SeqQueue(&sq);
}
int main(){
    int n;
    printf("请输入杨辉三角的层数:n=");
    scanf("%d",&n);
    Yanghui_triangle(n);
    return 0;
}

实现结果截图:
数据结构复习---------队列打印杨辉三角_第1张图片

你可能感兴趣的:(数据结构,C语言,队列,杨辉三角)