1. 程式人生 > >資料結構複習---------佇列列印楊輝三角

資料結構複習---------佇列列印楊輝三角

用佇列實現列印楊輝三角

問題介紹:
如果將二項式(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<cstdio>
#include<cstdlib>
#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;
}

實現結果截圖:
這裡寫圖片描述