数据结构实验报告四—基于队列的操作来实现杨辉三角
- 格式:doc
- 大小:61.00 KB
- 文档页数:7
杨辉三角显示实验报告1.问题描述:编写程序,根据输入的行数,屏幕显示杨辉三角。
2.基本要求:(1)行数不大于20行。
(2)基于队列的操作来实现杨辉三角的不断生成过程。
(注:不要用其它的公式计算的方法或者二维数组来实现)(3)基于数组实现队列的物理数据结构3.需求分析:1、输入形式:输入一个整数n ,0<=n<=202、输出形式:打印出来前(n+1)行的杨辉三角数列3、功能实现:输出前20层的杨辉三角序列4、样例输入输出:(数据加强版)输入:10输出:11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 11 6 15 20 15 6 11 7 21 35 35 21 7 11 8 28 56 70 56 28 8 11 9 36 84 126 126 84 36 9 15、效率分析:O(n)4.概要设计:利用到队列先进先出的性质(First In First Out),基本的算法实现是利用已经进队的元素在其出队之前杨辉三角的下一行数列,----即利用要出队的元素来不断地构造新的进队的元素,即在第N行出队的同时,我们来构造杨辉三角的第N+1行,从而实现打印杨辉三角的目的。
5.详细设计:算法思想已经在概要设计中提到了,现在通过基于队列基本操作的函数以及程序的模块化思想来实现杨辉三角的打印输出问题。
算法函数描述:队列类:队列类的数据成员:int front,rear,//ront和rear分别是指向队头和队尾的指针maxsize;//队列中的元素数int* listArray //存放队列中的元素队列的基本操作:V oid Queue(int ) function://构造一个空队列V oid EnQueue(,int x) :function://将元素x入队V oid outQueue():function://删除队头元素,并用x返回其值int getvalue()/取得队头的值int length()//返回队列中元素的个数通过在main函数中首先打印处第一二行并将大二行的数据存入队列中,根据用户输入的行数n;在for循环中反复的调用V oid EnQueue(,int x)、V oid outQueue()、int getvalue()等函数来实现杨辉三角的打印.调试分析:调试了很久,主要是在答应第二行以后的数列时的算法有点差错,最后,在队列类添加了int getvalue()函数,解决了算法的不足;还有运行时出现的错误,内存溢出,最后发现在对rear和front进行操作时没有除maxsize取余导致内存溢出;6.测试数据:7.实验心得这次试验中做的相对比较轻松,因为在上机课上之前我看了下题目,想了下这个题目的大概算法,并且上网查了些资料,所以上课之前有了大概的思路,所以半个小时左右就做出来了。
软件学院上机实验报告课程名称:数据结构实验项目:队列的应用实验室:耘慧420 姓名:学号专业班级:实验时间: 2016.11.17一、实验目的及要求(一) 目的1.掌握栈队列特点及顺序存储结构(循环队列)下基本操作的实现。
2.掌握队列的应用,能根据问题特点选择队列结构。
(二).要求1.定义循环队列的存储结构2.完成入队、出队、取队头等基本操作的实现。
3.利用队列的基本操作实现n行杨辉三角的输出。
4.主函数调用杨辉三角输出函数,实现n行杨辉三角输出。
二、性质设计性三、实验学时2学时四、实验环境C与C++程序设计学习与实验系统五、实验内容及步骤(一).内容1.定义循环队列的存储结构,完成入队、出队、取队头等基本操作的实现。
2. 利用循环队列实现杨辉三角的输出(二).步骤1.//---------循环队列—队列的顺序存储结构 -----#define MAXSIZE 100typedef struct {QElemType *base; //初始化的动态分配存储空间int front; //头指针,队列不空指向队列头元素int rear; //尾指针,队列不空指向队列尾元素下一位置} SqQueue;2.杨辉三角:11 11 2 11 3 3 11 4 6 4 1……………………这是一个初等数学中讨论的问题。
系数表中的第 k行有 k个数,除了第一个和最后一个数为1之外,其余的数则为上一行中位其左、右的两数之和。
如果要求计算并输出杨辉三角前n行的值,则队列的最大空间应为 n+2。
假设队列中已存有第 k 行的计算结果,并为了计算方便,在两行之间添加一个"0"作为行界值,则在计算第 k+1 行之前,头指针正指向第 k 行的"0",而尾元素为第 k+1 行的"0"。
由此从左到右依次输出第 k 行的值,并将计算所得的第 k+1 行的值插入队列的基本操作为:void YangHui(int n){printf("1\n");EnQueue(&q,0); /*开始*/EnQueue(&q,1); /*第1行*/EnQueue(&q,1);for(j=2;j<=n;j++){EnQueue(&q,0);do{DeQueue(&q,&s);GetHead(&q,&t);if(t) printf("%d\t",t); /*非0输出,否则换行*/ else printf("\n");EnQueue(&q,s+t);}while(t!=0); /*遇到结束符前循环*/}DeQueue(&q,&s);}六、实验数据及结果分析1.详细记录在调试过程中出现的问题及解决方法;杨辉三角;首先输入程序需要打印出来杨辉三角的行数N。
实习报告1.实习题目:杨辉三角2.实习内容:用循环队列或者链队列实现杨辉三角的输出3.程序代码说明(结合流程图,详细介绍关键算法的编程思路和所应用的数据结构知识):#include"iostream.h"#include"stdlib.h"typedef int QElemType;typedef struct LNode{QElemType data;struct LNode *next;}LNode,*QueuePtr; //链表typedef struct{QueuePtr front; //队头指针QueuePtr rear; //队尾指针} LinkQueue; //链队列void InitQueue( LinkQueue &Q){//构造一个空队列(带头结点)Q.front=Q.rear=new LNode;Q.front->next=NULL;}void DestroyQueue(LinkQueue &Q){//销毁队列,头结点也被销毁while(Q.front){Q.rear=Q.front->next;delete Q.front;Q.front = Q.rear;}//while}void EnQueue (LinkQueue &Q,QElemType e){//插入元素e为Q的新的队尾元素QueuePtr p;p=new LNode;p->data=e;p->next=NULL;Q.rear->next=p;Q.rear=p;}bool DeQueue (LinkQueue &Q, QElemType &e){//若队列不空,则删除Q的队头元素,用e返回其值,并返回TRUE,//否则返回FALSE;QueuePtr p;if(Q.front==Q.rear)return false;p=Q.front->next;e=p->data;Q.front->next=p->next;if(Q.rear==p)//保护尾指针Q.rear=Q.front;delete p;return true;}bool GetHead(LinkQueue &Q,QElemType &e){//获取队头元素if(Q.front==Q.rear)return false;else{e=Q.front->next->data;return true;}}void YangHui(int n){ int i,k;QElemType e,s;// 打印输出杨辉三角的前n ( n > 0 )行LinkQueue Q;for(i=0;i<n;i++) cout<<' ';cout<<'1'<<endl;//在中心位置输出杨辉三角最顶端的“1”InitQueue(Q);//设置最大容量为n+2的空队列EnQueue(Q,0);//添加行界值EnQueue(Q,1);EnQueue(Q,1);//第一行的值入队列k=1;while(k<n){//通过循环队列输出前n-1行的值for(i=1;i<=n-k;i++)cout<<' ';//输出n-k个空格以保持三角型EnQueue(Q,0);//行界值“0”入队列do{//输出第k行,计算第k+1行DeQueue(Q,s);//取出并删除队头元素GetHead(Q,e);//用e返回队头元素if(e) cout<<e<<' ';//若e为非行界值0,则打印输出e的值并加一空格else cout<<endl;//否则回车换行,为下一行输出做准备EnQueue(Q,s+e);//插入队尾元素s+e}while(e!=0);k++;}DeQueue(Q,e);while(Q.rear!=Q.front){DeQueue(Q,e);cout<<e<<' ';}cout<<' '<<endl;}//杨辉三角void main(){int n;cout<<"输入n值:";cin>>n;YangHui(n);}。
显⽰杨辉三⾓实验报告显⽰杨辉三⾓实验报告姓名:许严班级:计122 学号:12130230501.问题描述杨辉三⾓如图2.4.3所⽰,其特点是两个腰上数值是1,其他位置上的每⼀个整数都是它的上⼀⾏相邻两个整数之和。
问题是:对于指定的最⼤⾏数rmax,要求从第⼀⾏到第rmax逐⾏显⽰杨辉三⾓形的所有元素。
2.基本要求⑴设计输出形式,尽量反映杨辉三⾓的特点。
⑵设计计算杨辉三⾓形各⾏数值的⽅法。
⑶输⼊:rmax从键盘输⼊。
⑷输出:屏幕输出杨辉三⾓形.3.实现提⽰⑴存储设计计算杨辉三⾓形第i⾏时,如果在第i-1⾏两侧各添加⼀个0,则第i⾏的第j个元素等于第i-1⾏的第j-1个元素与第j个元素的和。
计算如图2.4.4所⽰。
第i⾏计算完,第i-1⾏的数据就没有⽤了,依据第i⾏数据可计算第i+1⾏的数据。
11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 1…图2.4.3 杨辉三⾓形从上述计算中不难看出,第i⾏的元素从左往右依次可被求得,求解过程中也是从左往右依次使⽤地i-1⾏的数据,显然,具有先⼊先出的特点。
所以,可借助⼀个队列存放计算过程中所需的数据,如图2.4.5所⽰。
但随着航数的增加,队列会很长。
所以,可以设置⼀循环队列,队长不少于rmax+2,边计算边出队。
(2)算法设计计算各⾏元素的算法步骤如下。
Step1:队列初始化,0、1⼊队。
队头ftont指向0处,队尾指向1后。
Step2:i从1到rmax,循环执⾏下列操作,求第i⾏数据。
2.1 0⼊队。
2.2 从队⾸起直到队尾,每出队两元素,求和后⼊队。
输出时注意0不输出。
(3)程序设计#includeusing namespace std;#includeint Fd(int x, int y){int t = 1;int k = 1;for(int i = y; i > x ; i--){t = t * i;t = t / k;k++;}return t;}int main(){int nsize;cout<<"请输⼊⼤⼩"<cout<<"提⽰:按Ctrl+Z两次退出!"<>nsize) {for(int i = 0; i <= nsize; i++){for(int k = 0 ; k <= nsize; k++){if(k > i){cout<<" ";}}for(int j = 0 ; j <= i; j++){cout<}cout<}cout<<"请输⼊⼤⼩"<}return 0;}4.测试与运⾏给出⾏数,从运⾏结果验证程序设计是否正确。
数据结构实验报告实验一杨辉三角形(Pascal’s triangle)一、需求分析1.输入的形式和输入值的范围本程序中,需输入的杨辉三角级数level为正整数,由键盘输入,以回车结束2.输出的形式通过屏幕输出杨辉三角3.程序所能达到的功能用户从键盘输入需要的杨辉三角级数,从屏幕输出杨辉三角4.测试数据输入:5输出: 1 11 2 11 3 3 11 4 6 4 11 5 10 10 5 1二、概要设计以链队列结构实现该实验1.抽象数据类型定义ADT Queue {数据对象:D = { ai | ai∈ElemSet , i = 1,2,…,n,n≥0 }数据关系:R1={<ai-1,ai> | ai-1 , ai∈D, i=2,…,n}约定其中ai端为队列头,an端为队列尾基本操作:InitQueue ( &Q )操作结果:构造一个空队列QDestroyQueue ( &Q )初始条件:队列Q已存在操作结果:队列Q被销毁,不再存在ClearQueue ( &Q )初始条件:队列Q已存在操作结果:将Q清为空队列QueueEmpty ( Q )初始条件:队列Q已存在操作结果:若Q为空队列,则返回TRUE,否则FALSEQueueLength ( Q )初始条件:队列Q已存在操作结果:返回Q的元素个数,即队列长度GetHead ( Q , &e )初始条件:Q为非空队列操作结果:用e返回Q的队头元素EnQueue ( &Q , e )初始条件:队列Q已存在操作结果:插入元素e为Q的新队尾元素DeQueue ( &Q , &e )初始条件:Q为非空队列操作结果:删除Q的队头元素,并用e返回其值QueueTraverse ( Q , visit( ) )初始条件:Q已存在且非空操作结果:从队头到队尾,依次对Q的每个数据元素调用函数visit( )。
杨辉三角问题描述编写程序,根据输入的行数,屏幕显示杨辉三角。
基本要求(1)行数不大于20行。
(2)基于队列的操作来实现杨辉三角的不断生成过程。
(注:不要用其它的公式计算的方法或者二维数组来实现)(3)基于数组实现队列的物理数据结构。
输入输出输入n= 6输出1 n=01 1 n=11 2 1 n=21 3 3 1 n=31 4 6 4 1 n=41 5 10 10 5 1 n=51 6 15 20 15 6 1 n=6概要设计:基本操作:SeqQueue()操作结果:构造一个空队列QmakeEmpty()初始条件:队列Q已存在操作结果:将Q清为空队列IsEmpty()初始条件:队列Q已存在操作结果:若Q为空队列,则返回TRUE,否则FALSE getSize()初始条件:队列Q已存在操作结果:返回Q的元素个数,即队列长度EnQueue(const T& x)初始条件:队列Q已存在操作结果:若队列不满,则将x进队,否则一处处理DeQueue(T& x);初始条件:Q为非空队列操作结果:删除Q的队头元素,并用x返回其值具体程序#include "stdlib.h"#include "stdio.h"#define OK 1#define error 0#define maxsize 100typedef int Qelemtype;typedef int status;typedef struct{Qelemtype *base;int f;int r;}Squeue;status InitQueue(Squeue & Q){Q.base=(Qelemtype*)malloc(maxsize*sizeof(Qelemtype));Q.base=new(Qelemtype);if(!Q.base)return error;Q.f=Q.r=0;return OK;}int Queuelength(Squeue & Q){return (Q.r-Q.f+maxsize)%maxsize;}status EnQueue(Squeue & Q,Qelemtype e){if((Q.r+1)%maxsize==Q.f){printf("队列已满\n");return error;}Q.base[Q.r]=e;Q.r=(Q.r+1)%maxsize;return OK;}status DeQueue(Squeue & Q,Qelemtype &e){if(Q.f==Q.r){printf("队列已空\n");return error;}e=Q.base[Q.f];Q.f=(Q.f+1)%maxsize;return OK;}void YangHui(int n){Squeue q; //建立队列对象int i=1,j,s=0,t,u; //计算下一行系数时用到的工作单元InitQueue(q);printf("\n 1");EnQueue(q,1);EnQueue(q,1); //预先放入第一行的两个系数for(i=1;i<=n;i++) //逐行处理{printf("\n"); //换一行EnQueue(q,0); //各行间插入一个for(j=1;j<=i+2;j++) //处理第i行的i+2个系数(包括一个){DeQueue(q,t); //读取一个系数u=s+t;EnQueue(q,u); //计算下一行系数,并进队列s=t;if(j!=i+2)printf("%3d",s); //打印一个系数,第i+2个是}}}void main() //主函数{int n;printf("输入n=");scanf("%d",&n);printf("输出:");YangHui (n);printf("\n");system("pause");}运行结果:算法的时空分析时间复杂度为O(N)输入输出格式输入:直接输入想要行数n输出:如果输入小于条件给予的20,则显示如题所要求的杨辉三角。
数据结构总结系列(四)——循环队列之杨辉三⾓今天我们来写⼀个循环队列的应⽤哦!解决的是杨辉三⾓问题~~对于这样⼀个上下多层之间有密切联系的数据,如果只是⽤数组和循环来解决的话,显然会浪费⼤量的空间和时间,所以我们⽤队列来解决这⼀问题:之所以选⽤循环队列也是因为它对于空间的利⽤是⾮常有效的,⽅便我们的⼯作:开始定义结构体:typedef struct//定义循环队列{int data[MAXMIZE];int Front;int Rear;}RollQueue;这⾥的最⼤值(MAXMIZE)⼤家可以⽤宏定义来⾃⼰定义想要的限制呦关于循环队列,由于它没有浪费空间,所以⾮常有⽤的背后就是要多计算⼀点插⼊的位置:所以我们之后的判断条件会多⼀点~队列相关函数的设置:由于队列是⼀种只能从队尾插⼊,从队头删除的结构,因此简化了我们的操作:void InitQueue(RollQueue &R)//队列初始化函数{R.Front=R.Rear=0;//博主这⾥没有⽤指针,直接⽤了数组~}void InsertQueue(RollQueue &R,int Data)//插⼊队尾{//⾸先判断是否满队列。
if((R.Rear+1)%MAXMIZE==R.Front)//满队列条件{cout << "This queue is full." << endl;}else{R.data[R.Rear]=Data;R.Rear=(R.Rear+1)%MAXMIZE;//success}}int DeleteQueue(RollQueue &R,int &Re)//删除队头元素,⽤re返回{if(R.Rear==R.Front)//判断是否队空{cout << "This queue is empty." << endl;return0;}else{Re=R.data[R.Front];R.Front=(R.Front+1)%MAXMIZE;return Re;}}最后是杨辉三⾓的建⽴:void YangHui(int n){RollQueue R;InitQueue(R);InsertQueue(R,1);//预先放⼊第⼀⾏的系数InsertQueue(R,1);//预先放⼊第⼀⾏的系数int s=0;for(int i=1;i<=n;i++){cout << endl;//这⾥换⾏鸭InsertQueue(R,0);//开头插⼊⼀个0⽤来进⾏第⼀次加法for(int j=1;j<=i+2;j++)//处理第i⾏的i+2个系数{int t;DeleteQueue(R,t);InsertQueue(R,s+t);//这⾥把上⼀⾏的两个数据相加得到这⼀⾏的数据s s=t;if(j!=i+2){cout << s << '' ;}}}}最后是整个程序:#include <bits/stdc++.h>using namespace std;#define MAXMIZE 100typedef struct//定义循环队列{int data[MAXMIZE];int Front;int Rear;}RollQueue;void InitQueue(RollQueue &R)//队列初始化函数{R.Front=R.Rear=0;//博主这⾥没有⽤指针,直接⽤了数组~}void InsertQueue(RollQueue &R,int Data)//插⼊队尾{//⾸先判断是否满队列。
循环队列实现杨辉三⾓形的打印知识温习循环队列:即将顺序队列的数组看成是⼀个环状的空间,规定最后⼀个单元的后继为第⼀个单元。
运⽤循环队列可以有效的解决链队列的“假溢出”现象。
假溢出其实是指在链队列中,当rear==MAXSIZE时就认为队满。
然⽽由于元素的出队,使得数组前⾯出现⼀些空单元,⽽元素⼜只能在队尾⼊队,如果此时已经到数组的尾部,就认为队列已满,但其实还存在上述那些空单元未使⽤,队列并未真正满。
这种现象即为“假溢出”现象。
真正的队满条件应该是rear-front==MAXSIZE。
在循环队列中,我们通过数学中的求模运算来改变头指针和尾指针的位置。
进队操作时,队尾指针的变化是:rear=(rear+1)mod MAXSIZE;⽽出队操作时,队头指针的变化是:front=(front+1)mod MAXSIE。
杨辉三⾓形11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 11 6 15 20 15 6 1从上图中可以看出,杨辉三⾓形的特点:每⾏的第⼀个元素和最后⼀个元素都为1,其他位置上的元素总是等于上⼀⾏与之相邻的两个元素之和。
故第i⾏的元素要由第i-1⾏的元素来⽣成。
可以利⽤循环队列实现杨辉三⾓形的打印过程:在循环队列中依次存放第i-1⾏上的元素,然后逐个出队并打印,同时⽣成第i⾏元素并⼊队。
下⾯⽤第6⾏元素⽣成第7⾏元素为例⼦来说明打印过程:①第7⾏的第⼀个元素1⼊队。
element[Q->rear] = 1;Q->rear = (Q->rear + 1)% MAXSIZE;②循环做以下操作,⽣成第7⾏的中间5个元素并⼊队。
element[Q->rear] = element[Q->front] + element[(Q->front+1)%MAXSIZE];Q->rear = (Q->rear + 1)%MAXSIZE;Q->front = (Q->front + 1)%MAXSIZE;③第6⾏的最后⼀个元素1⼊队。
《数据结构》实验报告项目名称栈、队列与杨辉三角专业班级软件工程工科试验班学号3903120128姓名谢江实验成绩:批阅教师:2012年5月22 日实验1《单链表的建立与约瑟夫问题》实验学时:实验地点:寝室与实验室实验日期:2012年5月22日1.需求分析实验2 主要是关于栈。
队列的建立以及杨辉三角问题的解决(队列运用)2.概要设计以及详细设计(1)栈class Stack{public:Stack();bool empty();//判断栈是否为空T peek();//显示栈顶元素void push(T value);//入栈T pop();//出栈int getSize();//当前栈中元素的数量private:T *elements;//数组指针int size;//栈中的元素数量int capacity;//栈的容量void ensureCapacity();//确认栈的容量是否大于元素数量};(2)队列class Queue{public:Queue();void enQueue(T element);//元素入队T deQueue();//元素出对,如果没有元素,抛出异常int getSize();//获取队列大小private:LinkedList<T> list;//定义表};3.调试分析内容包括:调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析;算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)和改进设想;经验和体会等。
个人标记:能建立顺序栈,以及链表顺序队列,对于比较复杂的链栈、循环队列等比较不熟悉,杨辉三角问题存在问题此次报告暂时不交,还有就是抛出异常的问题,例如:T deQueue()throw (runtime_error);//元素出对,如果没有元素,抛出异常会提示警告:C++ exception specification ignored except to indicate a function is not_declspec(nothrow)于是尽可能用if(…)throw runtime_error,就不报错了4.附录(1)栈Stack.h*****************************//采用数组的方式进行栈的操作#ifndef STACK_H#define STACK_Htemplate<typename T>class Stack{public:Stack();bool empty();//判断栈是否为空T peek();//显示栈顶元素void push(T value);//入栈T pop();//出栈int getSize();//当前栈中元素的数量private:T *elements;//数组指针int size;//栈中的元素数量int capacity;//栈的容量void ensureCapacity();//确认栈的容量是否大于元素数量};template<typename T>Stack<T>::Stack(){capacity = 10;//初始栈的大小size = 0;//初始元素的数量elements = new T[capacity];//建立指针}template<typename T>bool Stack<T>::empty(){if(size == 0)return true;elsereturn false;}template<typename T>//只显示栈顶元素并不出栈T Stack<T>::peek(){return elements[size - 1];}template<typename T>void Stack<T>::ensureCapacity(){if(size >= capacity)//如果满足进行指针的更换{T *old = elements;capacity = size + 1;elements = new T[capacity];for(int i = 0; i < size; i++)elements[i] = old[i];delete old;}}template<typename T>void Stack<T>::push(T value){ensureCapacity();//入栈前进行栈是否溢出的判断elements[size++] = value;}template<typename T>T Stack<T>::pop(){return elements[--size];}template<typename T>int Stack<T>::getSize(){return size;}#endif*************************************TestStack.cpp*************************************#include<iostream>#include"Stack.h"using namespace std;int main(){Stack<int> intS;cout << "before push size of intStack is: " << intS.getSize() << endl;//统计入栈前栈的大小for(int i = 0; i < 10; i++){int num;cout << "enter num: ";cin >> num;intS.push(num);}cout << "now size of intStack is: " << intS.getSize() << endl;//统计入栈后栈的大小while(!intS.empty()){cout << intS.pop() << " out " << endl;}cout << "after pop size of intStack is: " << intS.getSize() << endl;//出站后栈的大小system("pause");return 0;}##################################################(2)队列LinkedList.h******************************************#ifndef LINKEDLIST_H#define LINKEDLIST_H#include<stdexcept>using namespace std;template<typename T>class Queue;//前视定义,否则无法友元template<typename T>class Node{public :T element;//节点数据域Node<T> *next;//指向下指针Node(){next = NULL;}Node(T element){this -> element = element;next = NULL;}};template<typename T>class LinkedList{public:LinkedList();T removeFirst();//移除并返回表头元素void addLast(T element);//尾端插入新元素int getSize();//获取表的大小private:Node<T> *head, *tail;//定义头节点、尾节点int size;};template<typename T>LinkedList<T>::LinkedList()//初始化链表NULL{head = tail = NULL;size = 0;}template<typename T>void LinkedList<T>::addLast(T element){if(tail == NULL){head = tail = new Node<T>(element);}else{tail ->next = new Node<T>(element);tail = tail ->next;}size++;//作添加工作,size++}template<typename T>T LinkedList<T>::removeFirst(){if(size == 0)throw runtime_error("No elements");//抛出异常情况else{//删除并返回头节点元素,把下一节点作为新的头节点Node<T> *temp = head;head = head ->next;if(head == NULL)tail = NULL;size--;//作删除工作,size--T element = temp ->element;delete temp;return element;}}template<typename T>int LinkedList<T>::getSize()//返回size{return size;}#endif****************************************Queue.h***********************************#ifndef QUEUE_H#define QUEUE_H#include"LinkedList.h"#include<stdexcept>using namespace std;template<typename T>class Queue{public:Queue();void enQueue(T element);//元素入队T deQueue();//元素出对,如果没有元素,抛出异常int getSize();//获取队列大小private:LinkedList<T> list;//定义表};template<typename T>Queue<T>::Queue(){}//空的构造函数template<typename T>void Queue<T>::enQueue(T element){list.addLast(element);//入队(后插)}template<typename T>T Queue<T>::deQueue(){return list.removeFirst();//出对(前删)}template<typename T>int Queue<T>::getSize(){return list.getSize();}#endif******************************************* TestQueue.cpp*******************************************#include<iostream>#include<stdexcept>#include"Queue.h"using namespace std;int main(){Queue<int> q;cout << "before enQueue size is: " << q.getSize() << endl;for(int i = 0; i < 10; i++){q.enQueue(i);cout << i << " enter queue" << endl;}cout << "after enQueue size si: " << q.getSize() << endl;while(q.getSize()!=0){cout << q.deQueue() << "out queue" << endl;}cout << "after deQueue size is: " << q.getSize() << endl;system("pause");return 0;}。
杨辉三角显示
问题描述:
编写程序,根据输入的行数,屏幕显示杨辉三角。
一、需求分析:
1、行数不大于20行。
2、基于队列的操作来实现杨辉三角的不断生成过程。
(注:不要用其它的公式计算的方法或者二维数组来实现)
3、基于数组实现队列的物理数据结构。
输入形式:输入一个整数n (行数不大于20)
输出形式:打印出来前(n+1)行的杨辉三角数列
功能实现:输出前20层的杨辉三角序列
样例输入输出形式:
输入:6
输出:
1 n=0
1 1 n=1
1 2 1 n=2
1 3 3 1 n=3
1 4 6 4 1 n=4
1 5 10 10 5 1 n=5
1 6 15 20 15 6 1 n=6
5、效率分析:O(n)
二、概要设计:
抽象数据类型
void Queue::EnQueue(int item) //将元素item入列{QueueValue[++iLast]=item; } //入列
int Queue::OutQueue() //第一个元素出列返回此元素{ return QueueValue[++iFront];}
算法的基本思想:
下面为主要实现生成杨辉三角的算法:
Q.EnQueue(1); //第一行和第二行的生成
Q.EnQueue(1);
Q.EnQueue(1);
cout<<Q.OutQueue()<<" n=0\n";
for(i=3;i<=n+1;i++) //n行杨辉三角数的生成与输出 {Q.EnQueue(1);
t1=Q.OutQueue();
for(j=2;j<i;j++) //利用第n-1行的杨辉三角生成第n行的中间杨辉三角数
{ t 2=t1;
t1=Q.OutQueue(); //第n-1行第j个元素出列 Q.EnQueue(t1+t2); //第n行的第j个元素入列 cout<<t2<<" "; }
Q.EnQueue(1); //第n行最后一个元素为1 cout<<t1<<" n="<<i-2<<endl; } //输出第n-1行最后1个元素Q.EnQueue(0); //以防队列为空
while(--i) //输出最后一行
cout<<Q.OutQueue()<<" ";
cout<<" n="<<n<<endl;
}
程序的流程
程序由三个模块组成:
输入模块:输入一个整数n
计算模块:栈和杨辉三角的算法
输出模块:在屏幕上打印出来前(n+1)行的杨辉三角数列三、详细设计
算法的具体步骤:
算法思想已经在概要设计中提到了,现在通过基于队列基本操作的函数以及
程序的模块化思想来实现杨辉三角的打印输出问题。
算法函数描述:实现杨辉三角的算法,代码在算法的基本思想中已经提出,算法的时空分析:
由上可得该算法的时间复杂度O(n);
输入和输出的格式:
输入
请输入n: //输入一个数,这里输入6
回车
输出
在屏幕上现实n+1行杨辉三角数列
四、调试分析
在编写过程中出现了部分错误,但最后经过讨论和调试都得到了解决。
五、测试结果
六、用户使用说明(可选)
本程序的运行环境为windows 操作系统,执行文件为yanghui.exe 。
七、实验心得(可选)
此次实验没有通过什么公式,二维数组来实现杨辉三角,而是基于队列的操作来实现杨辉三角的不断生成过程。
一方面了队列的应用与算法,而且也了解到了新的方法实现杨辉三角。
在实验过程中遇到了部分问题,但通过与同学讨论得到了解决,挺有收获的,然需要再接再厉!
附录(实验代码):
#include<iostream>
#include<cstdlib>
using namespace std;
const int MaxSize=200;
class Queue
{friend void YangHuiSanJiao(int n); //生成杨辉三角的函数 private:
int QueueValue[MaxSize]; //用一个数组实现队列 int iFront,iLast;
public:
Queue(){iFront=iLast=-1;}
void EnQueue(int item); //将元素item入列int OutQueue(); }; //第一个元素出列返回此元素void Queue::EnQueue(int item) //将元素item入列{ QueueValue[++iLast]=item; } //入列
int Queue::OutQueue() //第一个元素出列返回此元素{ return QueueValue[++iFront];}
void YangHuiSanJiao(int n) //生成杨辉三角的函数{Queue Q;
int t1,t2;
int i,j;
//下面为主要实现生成杨辉三角的算法
Q.EnQueue(1); //第一行和第二行的生成
Q.EnQueue(1);
Q.EnQueue(1);
cout<<Q.OutQueue()<<" n=0\n";
for(i=3;i<=n+1;i++) //n行杨辉三角数的生成与输出 { Q.EnQueue(1);
t1=Q.OutQueue();
for(j=2;j<i;j++) //利用第n-1行的杨辉三角生成第n行的中间杨辉三角数
{ t2=t1;
t1=Q.OutQueue(); //第n-1行第j个元素出列
Q.EnQueue(t1+t2); //第n行的第j个元素入列 cout<<t2<<" "; }
Q.EnQueue(1); //第n行最后一个元素为1 cout<<t1<<" n="<<i-2<<endl; //输出第n-1行最后1个元素 }
Q.EnQueue(0); //以防队列为空
while(--i) //输出最后一行
cout<<Q.OutQueue()<<" ";
cout<<" n="<<n<<endl; }
int main()
{int n;
cout<<"请输入n:\n";
cin>>n; //输入n
YangHuiSanJiao(n); //生成杨辉三角并输出 system("pause");
return 0; }。