??????????本文將通過完成用隊(duì)列實(shí)現(xiàn)打印楊輝三角,代碼解釋標(biāo)注全面而且清晰,代碼書寫也十分規(guī)范,適合初學(xué)者進(jìn)行學(xué)習(xí),本篇文章算是本人的一些學(xué)習(xí)記錄分享,希望對(duì)有需要的小伙伴提供一些幫助~
希望能幫助大家掌握:
- 掌握定義順序隊(duì)和鏈隊(duì)的結(jié)點(diǎn)類型的方法;
- 熟悉隊(duì)列的入隊(duì)和出隊(duì)代表的實(shí)際意義;
- 掌握兩種存儲(chǔ)結(jié)構(gòu)下隊(duì)列的基本操作:入隊(duì)、出隊(duì)、輸出隊(duì)列等
一、鏈隊(duì)列楊輝三角:
(1)鏈隊(duì)列-楊輝三角
#include<iostream>
#include<fstream>
using namespace std;
#define OK 1
#define ERROR
#define OVERFLOW -2
typedef int QElemType;
typedef int Status;
typedef int SElemType;
//- - - - - 隊(duì)列的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)- - - - -
typedef struct QNode {
QElemType data;
struct QNode *next;
} QNode, *QueuePtr;
typedef struct {
QueuePtr front; //隊(duì)頭指針
QueuePtr rear; //隊(duì)尾指針
} LinkQueue;
//算法3.16 鏈隊(duì)的初始化
LinkQueue InitQueue() {//構(gòu)造一個(gè)空隊(duì)列Q
LinkQueue Q;
Q.front = Q.rear = new QNode; //生成新結(jié)點(diǎn)作為頭結(jié)點(diǎn),隊(duì)頭和隊(duì)尾指針指向此結(jié)點(diǎn)
Q.front->next = NULL; //頭結(jié)點(diǎn)的指針域置空
return Q;
}
//算法3.17 鏈隊(duì)的入隊(duì)
LinkQueue InserQ(LinkQueue &Q, QElemType e) {//插入元素e為Q的新的隊(duì)尾元素
QueuePtr p;
p = new QNode; //為入隊(duì)元素分配結(jié)點(diǎn)空間,用指針p指向
p->data = e; //將新結(jié)點(diǎn)數(shù)據(jù)域置為e
p->next = NULL;
Q.rear->next = p; //將新結(jié)點(diǎn)插入到隊(duì)尾
Q.rear = p; //修改隊(duì)尾指針
return Q;
}
//算法3.18 鏈隊(duì)的出隊(duì)
LinkQueue DeleteQ(LinkQueue &Q) {//刪除Q的隊(duì)頭元素,用e返回其值
QueuePtr p;
int e;
//if (Q.front == Q.rear)
// return ERROR; //若隊(duì)列空,則返回ERROR
p = Q.front->next; //p指向隊(duì)頭元素
e = p->data; //e保存隊(duì)頭元素的值
Q.front->next = p->next; //修改頭指針
if (Q.rear == p)
Q.rear = Q.front; //最后一個(gè)元素被刪,隊(duì)尾指針指向頭結(jié)點(diǎn)
delete p; //釋放原隊(duì)頭元素的空間
return Q;
}
//算法3.19 取鏈隊(duì)的隊(duì)頭元素
SElemType GetHead(LinkQueue Q) {//返回Q的隊(duì)頭元素,不修改隊(duì)頭指針
if (Q.front != Q.rear) //隊(duì)列非空
return Q.front->next->data; //返回隊(duì)頭元素的值,隊(duì)頭指針不變
}
int main()
{ LinkQueue Q;
int i,n,x,j;
printf("輸入行數(shù)n:");
scanf("%d",&n); /* n為楊輝三角行數(shù) */
Q=InitQueue(); /*初始化隊(duì)列*/
Q=InserQ (Q, 1); /* 第1行的1進(jìn)隊(duì)列 */
for (i=2; i<=n; i++) /* 打印第i-1行并生成第i行 */
{ Q=InserQ (Q, 1); /* 第i行中的第一個(gè)元素1進(jìn)隊(duì) */
for(j=1; j<i-1; j++) /* 打印第i-1行的第j個(gè)*/
{ printf("%d ",Q.front->next->data); /* 輸出隊(duì)頭 */
x=GetHead (Q); /*x獲得隊(duì)頭的值*/
Q=DeleteQ (Q); /*刪除隊(duì)頭元素-出隊(duì)*/
x=x+ Q.front->next->data; /* 計(jì)算第i行的值 */
Q=InserQ (Q, x); /*x入隊(duì)*/
}
printf("%d\n",Q.front->next->data); /* 打印第i-1行的最后一個(gè)1并換行 */
Q=DeleteQ (Q); /*刪除隊(duì)頭元素-出隊(duì)*/
Q=InserQ (Q,1); /* 第i行中的最后一個(gè)元素1進(jìn)隊(duì) */
}
while (Q.front!=Q.rear) /* 輸出最后一行元素 */
{ printf("%d ",Q.front->next->data);
Q=DeleteQ (Q); /*刪除隊(duì)頭元素-出隊(duì)*/
}
return 0;
}
運(yùn)行結(jié)果如下:
二、循環(huán)隊(duì)列楊輝三角:
/***循環(huán)隊(duì)列楊輝三角基本操作***/
#include<iostream>
#include<fstream>
using namespace std;
#define MAXQSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef char QElemType;
typedef int SElemType;
typedef int Status;
typedef struct {
QElemType *base;//初始化時(shí)動(dòng)態(tài)分配存儲(chǔ)空間
int front;//頭指針
int rear;//尾指針
} SqQueue;
//算法3.11 循環(huán)隊(duì)列的初始化
SqQueue InitQueue() {//構(gòu)造一個(gè)空隊(duì)列Q
SqQueue Q;
Q.base = new QElemType[MAXQSIZE]; //為隊(duì)列分配一個(gè)最大容量為MAXSIZE的數(shù)組空間
if (!Q.base)
exit(OVERFLOW); //存儲(chǔ)分配失敗
Q.front = Q.rear = 0; //頭指針和尾指針置為零,隊(duì)列為空
return Q;
}
//算法3.12 求循環(huán)隊(duì)列的長(zhǎng)度
int QueueLength(SqQueue Q) {//返回Q的元素個(gè)數(shù),即隊(duì)列的長(zhǎng)度
return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
}
//算法3.13 循環(huán)隊(duì)列的入隊(duì)
SqQueue InserQ(SqQueue &Q, QElemType e) {//插入元素e為Q的新的隊(duì)尾元素
//if ((Q.rear + 1) % MAXQSIZE == Q.front) //尾指針在循環(huán)意義上加1后等于頭指針,表明隊(duì)滿
// return ERROR;
Q.base[Q.rear] = e; //新元素插入隊(duì)尾
Q.rear = (Q.rear + 1) % MAXQSIZE; //隊(duì)尾指針加1
return Q;
}
//算法3.14 循環(huán)隊(duì)列的出隊(duì)
SqQueue DeleteQ(SqQueue &Q) {//刪除Q的隊(duì)頭元素,用e返回其值
int e=0;
//if (Q.front == Q.rear)
// return ERROR; //隊(duì)空
e = Q.base[Q.front]; //保存隊(duì)頭元素
Q.front = (Q.front + 1) % MAXQSIZE; //隊(duì)頭指針加1
return Q;
}
//算法3.15 取循環(huán)隊(duì)列的隊(duì)頭元素
SElemType GetHead(SqQueue Q) {//返回Q的隊(duì)頭元素,不修改隊(duì)頭指針
if (Q.front != Q.rear) //隊(duì)列非空
return Q.base[Q.front]; //返回隊(duì)頭元素的值,隊(duì)頭指針不變
}
int main()
{ ?SqQueue Q;
???int i,n,x,j;
???printf("輸入行數(shù)n:");
???scanf("%d",&n); ????/* n為楊輝三角行數(shù) */
???Q=InitQueue(); /*初始化隊(duì)列*/
???Q=InserQ (Q, 1); ????????/* 第1行的1進(jìn)隊(duì)列 */
???for (i=2; i<=n; i++) ????/* 打印第i-1行并生成第i行 */
???{ ?Q=InserQ (Q, 1); ?????/* 第i行中的第一個(gè)元素1進(jìn)隊(duì) */
??????for(j=1; j<i-1; j++) ?/* 打印第i-1行的第j個(gè)*/
??????{ ??printf("%4d",Q.base[Q.front]); ???/* 輸出隊(duì)頭 */
??????????x=GetHead (Q); ?/*x獲得隊(duì)頭的值*/
??????????Q=DeleteQ (Q); ?/*刪除隊(duì)頭元素-出隊(duì)*/
??????????x=x+ Q.base[Q.front]; ?????/* 計(jì)算第i行的值 */
??????????Q=InserQ (Q, x); ?/*x入隊(duì)*/
??????}
??????printf("%4d\n",Q.base[Q.front]); /* 打印第i-1行的最后一個(gè)1并換行 */
??????Q=DeleteQ (Q); ?????/*刪除隊(duì)頭元素-出隊(duì)*/
??????Q=InserQ (Q,1); ??????/* 第i行中的最后一個(gè)元素1進(jìn)隊(duì) */
??}
??while (Q.front!=Q.rear) ????/* 輸出最后一行元素 */
??{ ??printf("%4d",Q.base[Q.front]);
??????Q=DeleteQ (Q); ??/*刪除隊(duì)頭元素-出隊(duì)*/
??}
??return 0;
?運(yùn)行結(jié)果如下:
????????希望通過實(shí)現(xiàn)楊輝三角的打印能更好地掌握定義順序隊(duì)和鏈隊(duì)的結(jié)點(diǎn)類型的方法,熟悉隊(duì)列的入隊(duì)和出隊(duì)分別所代表的實(shí)際意義,對(duì)兩種存儲(chǔ)結(jié)構(gòu)下隊(duì)列的基本操作:入隊(duì)、出隊(duì)、輸出隊(duì)列等加深理解。文章來源:http://www.zghlxwxcb.cn/news/detail-735320.html
以上即是本文的全部?jī)?nèi)容,喜歡可以點(diǎn)贊收藏~文章來源地址http://www.zghlxwxcb.cn/news/detail-735320.html
到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu):編寫程序用隊(duì)列實(shí)現(xiàn)打印楊輝三角的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!