数据结构-利用循环队列打印杨辉三角
队列——杨辉三角——王文合

一、 实验目的
掌握队列的基本操作:初始化队列、判队列为空、出队列、入队列等运算。
二、实验要求
1. 认真阅读和掌握本实验的算法。 2. 上机将本算法实现。 3. 保存和打印出程序的运行结果,并结合程序进行分析。
三、实验题目 杨辉三角形问题
问题描述:利用队列的基本操作实现杨辉三角形的输出
四:实验人:保定学院 13 级软件工程 1 班-王文合 五:代码实现:
学号:130624074 时间:2014.10.19
程序代码
#include"stdio.h" #include"conio.h" #define M 100
typedef struct {
int data[M]; int f,r;
}SE; SE IN()//创建队列
{ SE Q; Q.f=Q.r=1;
return Q; } void sanjiao(int h,SE Q)//杨辉三角核心算法
{ int c,n,d,k,l; SE q=Q;
for(c=1;c<=h;c++) { for(l=0;l<h-c;l++)
{ printf(" ");
q.data[q.r]=n;
} printf("%d ",q.data[q.f]);
} printf("\n\n"); }
} main(){//主方法 int a; SE Q=IN(); printf("请输入杨辉三角的行数 A!\n"); scanf("%d",&a); sanjiao(a,Q); getch(); } 六:测试
打印输出杨辉三角的前n(n0)行

#ifndef DS_H#define DS_H#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2//Status是函数的类型,其值是函数结果状态代码typedef int Status;#endif//////////////////////////////////////#include "ds.h"#ifndef SqQueue_H#define SqQueue_H#define MAXQSIZE 100//最大队列长度typedef int QElemType;typedef struct{QElemType *base;//动态分配存储空间int front;//头指针,若队列不空,指向队列头元素int rear; //尾指针,若队列不空,指向队列尾元素的下一个位置}SqQueue;Status InitQueue(SqQueue &,int);Status EnQueue(SqQueue &,QElemType);Status DeQueue(SqQueue &,QElemType &);void GetHead(SqQueue,QElemType &);bool QueueEmpty(SqQueue);#endif///////////////////////////////////////#include <stdlib.h>#include "ds.h"#include "SqQueue.h"Status InitQueue(SqQueue &Q,int x){//构造一个空队列QQ.base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));if(!Q.base)exit(OVERFLOW);//存储分配失败Q.front=Q.rear=0;return OK;}Status EnQueue(SqQueue &Q,QElemType e){//插入元素e为Q的新的队尾元素if((Q.rear+1)%MAXQSIZE==Q.front)return ERROR; //队列满Q.base[Q.rear]=e;Q.rear=(Q.rear+1)%MAXQSIZE;return OK;}Status DeQueue(SqQueue &Q,QElemType &e){//若队列不空,则删除Q的队头元素用e返回其值,并返回OK;否则返回ERROR if(Q.front==Q.rear)return ERROR;e=Q.base[Q.front];Q.front=(Q.front+1)%MAXQSIZE;return OK;}void GetHead(SqQueue Q,QElemType &e){e=Q.base[Q.front];}bool QueueEmpty(SqQueue Q){if(Q.front==Q.rear)return true;elsereturn false;}////////////////////////////////////////////////////#include <iostream.h>#include "ds.h"#include "SqQueue.h"void yanghui(int n){//打印输出杨辉三角的前n(n>0)行SqQueue Q;int i;QElemType e;int k;for(i=1;i<=n;i++)cout<<' ';cout<<'1'<<endl;//在中心位置输出杨辉三角最顶端的"1"InitQueue(Q,n+2);// 设置最大容量为n+2的空队列EnQueue(Q,0);//添加行界值EnQueue(Q,1);EnQueue(Q,1 );//第一行的值入队列k=1;while(k<n){//通过循环队列输出前n-1行的值QElemType s;for(i=1;i<=n-k;i++)cout<<' ';//输出n-k个空格以保持三角型EnQueue(Q,0);//行界值"0"入队列do{//输出第k行,计算第k+1行DeQueue(Q,s);GetHead(Q,e);if(e)cout<<e<<' ';//若e为非行界值0,则打印输出e的值并加一空格else cout<<endl;//否则回车换行,为下一行输出做准备EnQueue(Q,s+e);}while(e!=0);k++;}//whileDeQueue(Q,e);//行界值"0"出队列while(!QueueEmpty(Q)){//单独处理第n行的值的输出DeQueue(Q,e);cout<<e<<' ';}//while}//yanghuivoid main(){yanghui(4);}////////////////////////////////////////////。
杨辉三角实验报告

杨辉三角(一)需求分析1.逐行打印二项展开式(a + b)i 的系数2.要求:输入杨辉三角的阶数n,在屏幕上显示数杨辉三角形。
3.输入的值n以小于12为宜(图形漂亮)。
(二)概要设计1. 首先初始化一个队列,元素为1,然后根据这个队列迭代生成任意行的二项式系数。
2. 判断用户输入的行数,然后决定循环次数。
这些循环中,程序根据杨辉三角的实际构造函数模拟构造过程。
每次形成一个新的二项式系数序列,并将这个序列保持在一个新的队列中。
本次循环结束后,这个心构造的序列将作为下次循环来构造另一个二项式序列的参照序列。
(三)详细设计1.定义队列结点typedef struct QNode{int data;struct QNode *next;}QNode ,*QueuePtr;typedef struct {QueuePtr front;QueuePtr rear;}LinkQueue;2.基本操作函数原型●队列初始化void InitQueue(LinkQueue *Q){Q->front =Q->rear = (QueuePtr)malloc(sizeof(QNode));if(!Q->front) printf("OVERFLOW");Q->front->next= NULL;}●插入元素e为新的队尾元素void EnQueue(LinkQueue *Q,int e){QNode *p;p = (QueuePtr)malloc(sizeof(QNode));if(!p) printf("OVERFLOW");p->data = e;p->next = NULL;Q->rear->next = p;Q->rear = p;}●void DeQueue(LinkQueue *Q){ QNode *p;if(Q->front == Q->rear) printf("ERROR");Q->front->next = Q->front->next->next;}●美化形状for(i = 1;i <= n; i++){printf("\n");c=i;for(b=1;b<=n-c;c++){printf(" ");}}●根据上行系数求下行系数for (j=1;j<=i+2;j++){t = q->front->next->data;DeQueue (q);EnQueue (q,s+t);s = t;if (j!=i+2) printf("%3d ",s);}(四)调试分析1.美化形状时,第一次的输出空格的个数和位置考虑的有瑕疵,导致图像歪歪曲曲的。
数据结构-利用循环队列打印杨辉三角

//------循环队列—队列的顺序存储结构-----#include<stdio.h>#include<malloc.h>#include<process.h> //exit的头文件#define OK 1#define ERROR 0#define MAXQSIZE 100//最大队列长度#define Status int#define N 10#define QElemType inttypedef struct{QElemType *base;//初始化的动态分配存储空间int front; //头指针,若队列不空,指向队列头元素int rear; //尾指针,若队列不空,指向队列队尾元素的下一位置}SqQueue;//-----循环队列的基本操作的算法描述----Status InitQueue(SqQueue &Q){//构造一个空队列Q.base=(QElemType *)malloc(MAXQSIZE * sizeof(QElemType));if(!Q.base)exit(-1);//存储分配失败Q.front=Q.rear=0;return OK;}int QueueLength(SqQueue Q){//返回Q的元素个数,即队列的长度return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;}Status EnQueue(SqQueue &Q,QElemType e){//插入元素e为Q的新的队尾元素if((Q.rear+1)%MAXQSIZE==Q.front) return ERROR;//队列满Q.base[Q.rear]=e;Q.rear=(Q.rear+1)%MAXQSIZE;return OK;}Status DeQueue(SqQueue &Q,QElemType &e){//若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;//否则返回ERRORif(Q.front==Q.rear) return ERROR;e=Q.base[Q.front];Q.front=(Q.front+1)%MAXQSIZE;return OK;}Status GetHead(SqQueue &Q,QElemType &e){//若队列不空,则用e返回Q的队头元素,并返回OK;//否则返回ERRORif(Q.front==Q.rear) return ERROR;e=Q.base[Q.front];return OK;}//----打印杨辉三角(前N行)-------------void YangHuiTriangle(){int i,n,temp,x;SqQueue Q;InitQueue(Q);EnQueue(Q,1); //第一行元素入队for(n=2;n<=N;n++) //产生第n行元素并入队,同时打印第n-1行的元素{EnQueue(Q,1); //第n行的第一个元素入队for(i=1;i<=n-2;i++) //利用队中第n-1行元素产生第n行的中间n-2个元素并入队{DeQueue(Q,temp);printf("%d",temp); //打印第n-1行的元素GetHead(Q,x);temp=temp+x; //利用队中第n-1行元素产生第n行元素EnQueue(Q,temp);}//forDeQueue(Q,x);printf("%d",x); //打印第n-1行的最后一个元素EnQueue(Q,1); //第n行的最后一个元素入队printf("\n");}//for}//YangHuiTrianglevoid main(){YangHuiTriangle();}Welcome !!! 欢迎您的下载,资料仅供参考!。
用队列方法输出杨辉三角

/*用队列方法输出杨辉三角。
*/#include<iostream.h>#include<iomanip.h>#include<stdlib.h>#define ElemType int/*-----LNode的结点类型定义-----*/struct LNode{ElemType data; //值域LNode* next; //链接指针域};/*-----队列的链接存储结构的定义-----*/struct LinkQueue{LNode* front; //队首指针LNode* rear; //队尾指针};/*------1.初始化链队-----*/void InitQueue(LinkQueue& HQ){HQ.front=HQ.rear=NULL; //把队首和队尾指针置为空}/*-----2.向链队中插入一个元素------*/void EnQueue(LinkQueue& HQ, ElemType item){LNode* newptr=new LNode; //得到一个新的结点newptr->data=item; //把item 的值赋给新结点的值域newptr->next=NULL; //把新结点的指针域置为空if(HQ.rear==NULL) //若链队为空,则新结点既是队首又是队尾{HQ.front=HQ.rear=newptr;}else //若链队非空,则新结点被链接到队尾并修改队尾指针{HQ.rear=HQ.rear->next=newptr;}}/*-------3.从队列中删除一个元素-------*/ElemType OutQueue(LinkQueue& HQ){if(HQ.front==NULL) //若链队为空则终止运行{cerr<<"链队为空,无法删除!"<<endl;exit(1);}ElemType temp=HQ.front->data; //暂存队首元素以便返回LNode* p=HQ.front; //暂存队首指针以便收回队首指针HQ.front=p->next; //使队首指针指向下一个结点if(HQ.front==NULL) //若删除后链队为空,则使队尾指针为空{HQ.rear=NULL;}delete p; //回收原队首结点return temp; //返回被删除的队首元素}void YanyHuiTriangular(LinkQueue& HQ, int n){int i,j; //i,j 都是循环变量int first,second; //first,second 分别记录上一行的两个累加数EnQueue(HQ,1);for(i=1; i<n+1; i++){ //第 0 至 n-1 行元素分别入列,并输出;最后第 n 行入列first=0; second=0;//控制每行前头空格的输出for(j=0; j<n-i+1; j++){cout<<setw(3)<<' ';}for(j=0; j<i; j++){second=OutQueue(HQ);cout<<setw(3)<<second<<setw(3)<<' ';EnQueue(HQ,first+second);first=second;}cout<<endl; //输完一行,回车EnQueue(HQ,second);}//最后输出最后一行元素(即第 n 行出列)for(j=0; j<n+1; j++){cout<<setw(3)<<OutQueue(HQ)<<setw(3)<<' '; }cout<<endl;}void main(){LinkQueue LQ;InitQueue(LQ);cout<<"用队列输出杨辉三角!"<<endl<<endl; int n;cout<<"请输入要输出多少行杨辉三角:"; cin>>n;YanyHuiTriangular(LQ,n);}。
C#2010 打印杨辉三角

}
(4)执行程序,命令行中就会打印出一个6阶的杨辉三角,执行结果如图2-3所示。
图2-3执行结果
C#2010
杨辉三角又称为贾宪三角,是二项式系数在三角形中的一种几何排列。杨辉三角横行的数字规律主要包括横行各数之间的大小关系、组合关系以及不同横行数字之间的联系。本练习就将使用循环语句、利用各数之间的关系打印出指定行数的杨辉三角,具体操作如下所示:
(1)程序分析杨辉三角其规律为两腰都为1;除腰上的1以外的各数,都等于它“肩上”的两数之和。此时,只需给定行数,就可以按照以上规律来打印出杨辉三角。
}else
{
}
}
}
(3)然后,在else内,再次编写for循环语句打印杨辉三角的第2行至第6行,代码如下所示。
else{
for (j = 1; j <= i + 1;j++ )
{
if (j == 1 || j == i + 1)
{
Console.Write("1 ");
tmp[j - 1] = 1;
(2)在main()函数中,指定杨辉三角是一个7行的等边三角形,编写第一层for循环语句来控制打印的行数,而杨辉三角第0行和第1行是直接打印出来的,代码如下所示。
static void Main(string[] args)
{
int i, j, k;
int[] buf = new int[7];
int[] tmp = new int[7];
}
else {
Console.Write(buf[j-2]+buf[j-1]+" ");
tmp[j - 1] = buf[j - 2] + buf[j - 1];
数据结构与算法-杨辉三角

实习报告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);}。
数据结构实验报告(杨辉三角-约瑟夫环)

数据结构实验报告实验一杨辉三角形(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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DeQueue(Q,temp);
printf("%d",temp); //打印第n-1行的元素
GetHead(Q,x);
temp=temp+x; //利用队中第n-1行元素产生第n行元素
EnQueue(Q,temp);
}//for
DeQueue(Q,x);
printf("%d",x); //打印第n-1行的最后一个元素
InitQueue(Q);
EnQueue(Q,1); //第一行元素入队
for(n=2;n<=N;n++) //产生第n行元素并入队,同时打印第n-1行的元素
{
EnQueue(Q,1); //第n行的第一个元素入队
for(i=1;i<=n-2;i++) //利用队中第n-1行元素产生第n行的中间n-2个元素并入队
#define N 10
#define QElemType int
typedef struct{
QElemType *base;//初始化的动态分配存储空间
int front; //头指针,若队列不空,指向队列头元素
int rear; //尾指针,若队列不空,指向队列队尾元素的下一位置
}SqQueue;
EnQueue(Q,1); //第n行的最后一个元素入队
printf("\n");
}//for
}//YangHuiTriangle
void main()
{
YangHuiTriangle();
}
if((Q.rear+1)%MAXQSIZE==Q.front) return ERROR;//队列满
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
return OK;
}
Status DeQueue(SqQueue &Q,QElemType &e){
//若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;
return OK;
}
int QueueLength(SqQueue Q){
//返回Q的元素个数,即队列的长度
return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}
Status EnQueue(SqQueue &Q,QElemType e){
//插入元素e为Q的新的队尾元素
//-----循环队列的基本操作的算法描述----
Status InitQueue(SqQueue &Q){
//构造一个空队列
Q.base=(QElemType *)malloc(MAXQSIZE * sizeof(QElemType));
if(!Q.base)exit(-1);//存储分配失败
Q.front=Q.rear=0;
//否则返回ERROR
if(Q.front==Q.rear) return ERROR;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
return OK;
}
Status GetHead(SqQueue &Q,QElemType &e){
//若队列不空,则用e返回Q的队头元素,并返回OK;
//------循环队列—队列的顺序存储结构-----
#include<stdio.h>
#include<malloc.h>
#include<process.h> //exit的头文件
#define OK 1
#define ERROR 0
#define MAXQSIZE 100//最大队列长度
#define Status int
//否则返回ERROR
if(Q.front==Q.rear) return ERROR;
e=Q.base[Q.front];
return OK;
}
//----打印杨辉三角(前N行)-------------
void YangHuiTriangle()
{
i,n,temp,x;
SqQueue Q;