資料結構複習---------佇列列印楊輝三角
阿新 • • 發佈:2019-02-08
用佇列實現列印楊輝三角
問題介紹:
如果將二項式(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;
}
實現結果截圖: