软件学院上机实验报告课程名称:数据结构实验项目:队列的应用实验室:耘慧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。
(截图的N值为12),N值要求小于等于20。
之后运行程序,即得到如下结果队列进队七、总结通过对本程序的练习,更好地掌握了队列的概念和相关操作,对杨辉三角的算法、队列的进队出队有了更深刻的认识。
在实验中,增强了C语言开发的语法知识,体会到自己C语言知识的不足,造成了自己调试程序没有那么顺利。
以后要增加C语言和C++语言的区别。
使得自己更快,更准的进行程序的调试。
附录源程序清单插入;队列进队;#include "stdio.h"#include "malloc.h"#define OK 1#define OVERFLOW -1#define ERROR 0#define QMAXSIZE 23//定义长度,长度>=输出行数+3typedef int ElemType;typedef int Status;typedef struct{ElemType data[ QMAXSIZE ];//定义数据域ElemType *base; //初始化的动态分配存储空间int front; //头指针,队列不空指向队列头元素int rear; //尾指针,队列不空指向队列尾元素下一位置}SqQueue;Status InitQueue(SqQueue *Q){//构造空队列Q->base=(ElemType *)malloc(QMAXSIZE * sizeof(ElemType));//分配空间if(!Q->base)return ERROR;Q->front=Q->rear=0;return OK;}Status QueueLength(SqQueue Q){//获取队列长度return (Q.rear-Q.front+QMAXSIZE)%QMAXSIZE;}Status GetHead(SqQueue Q){//返回队头元素ElemType e;if(Q.front == Q.rear)e=0;elsee=Q.data[Q.front];return e;}Status EnQueue(SqQueue *Q,ElemType e){//插入元素if((Q->rear+1)% QMAXSIZE == Q->front)return ERROR;Q->data[Q->rear]=e;Q->rear=(Q->rear+1)%QMAXSIZE;return OK;}Status DeQueue(SqQueue *Q,ElemType *e) {//删除元素if(Q->front == Q->rear)return ERROR;*e=Q->data[Q->front];Q->front=(Q->front+1)%QMAXSIZE;return OK;}Status QueueEmpty(SqQueue *Q){//判断队列是否为空if(Q->front==Q->rear)return OK;elsereturn ERROR;}void TraversalSq(SqQueue Q){//遍历队列ElemType s;do{DeQueue(&Q,&s);printf("%d\t",s);}while(!QueueEmpty(&Q));printf("\n");}void main(){SqQueue Q;ElemType e;if(InitQueue(&Q))printf("队列构造成功!\n");elseprintf("队列构造失败!\n");while(e!=0){printf("请输入要插入的数据:");scanf("%d",&e);if(e==0)break;if(EnQueue(&Q,e))printf("入队成功!\n");elseprintf("入队失败!\n");}printf("队列长度为:%d\n",QueueLength(Q));printf("队头元素为:%d\n",GetHead(Q));TraversalSq(Q);if(!QueueEmpty(&Q))printf("队列不为空!\n");elseprintf("队列为空!\n");}杨辉三角;#include "stdio.h"#include "malloc.h"#define OK 1#define OVERFLOW -1#define ERROR 0#define QMAXSIZE 23//定义长度,长度>=输出行数+3typedef int ElemType;typedef int Status;typedef struct{ElemType data[ QMAXSIZE ];//定义数据域ElemType *base; //初始化的动态分配存储空间int front; //头指针,队列不空指向队列头元素int rear; //尾指针,队列不空指向队列尾元素下一位置}SqQueue;Status InitQueue(SqQueue *Q){//构造空队列Q->base=(ElemType *)malloc(QMAXSIZE * sizeof(ElemType));//分配空间if(!Q->base)return ERROR;Q->front=Q->rear=0;return OK;}Status QueueLength(SqQueue Q){//获取队列长度return (Q.rear-Q.front+QMAXSIZE)%QMAXSIZE;}void GetHead(SqQueue Q,ElemType *e){//返回队头元素if(Q.front == Q.rear)*e=0;else*e=Q.data[Q.front];}Status EnQueue(SqQueue *Q,ElemType e){//插入元素if((Q->rear+1)% QMAXSIZE == Q->front)return ERROR;Q->data[Q->rear]=e;Q->rear=(Q->rear+1)%QMAXSIZE;return OK;}Status DeQueue(SqQueue *Q,ElemType *e) {//删除元素if(Q->front == Q->rear)return ERROR;*e=Q->data[Q->front];Q->front=(Q->front+1)%QMAXSIZE;return OK;}Status QueueEmpty(SqQueue *Q){//判断队列是否为空if(Q->front==Q->rear)return OK;elsereturn ERROR;}void TraversalSq(SqQueue Q,ElemType n) {//遍历队列ElemType s;printf("第%d行:",n);do{DeQueue(&Q,&s);printf("%d\t",s);}while(!QueueEmpty(&Q));printf("\n");void YangHui(int n){//杨辉三角SqQueue Q;ElemType j,s,t;printf("第1行:1\n");InitQueue(&Q);EnQueue(&Q,0); /*开始*/EnQueue(&Q,1); /*第1行*/EnQueue(&Q,1);for(j=2;j<n;j++)//从第二行开始循环到n-1行{EnQueue(&Q,0); /*第j行的结束符*/printf("第%d行:",j);do{DeQueue(&Q,&s);GetHead(Q,&t);if(t)printf("%d\t",t); /*非0输出,否则换行*/ elseprintf("\n");EnQueue(&Q,s+t);}while(t!=0); /*遇到结束符前循环*/}DeQueue(&Q,&s); //输出最后一行TraversalSq(Q,j);main(){ElemType n;while(1){printf("请输入输出的行数(小于等于%d):",QMAXSIZE-3);scanf("%d",&n);if(n<=(QMAXSIZE-3)&&n>1){YangHui(n);break;}elseprintf("输入错误,请重新输入\n");}getch();}。