数据结构实验三栈和队列.docx
- 文档编号:4709765
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:13
- 大小:19.83KB
数据结构实验三栈和队列.docx
《数据结构实验三栈和队列.docx》由会员分享,可在线阅读,更多相关《数据结构实验三栈和队列.docx(13页珍藏版)》请在冰豆网上搜索。
数据结构实验三栈和队列
数据结构实验三
1、实验目的
∙熟练掌握栈和队列的特点
∙掌握栈的定义和基本操作,熟练掌握顺序栈的操作及应用
∙掌握对列的定义和基本操作,熟练掌握链式队列的操作及应用,掌握环形队列的入队和出队等基本操作
∙加深对栈结构和队列结构的理解,逐步培养解决实际问题的编程能力
2、实验内容:
定义顺序栈,完成栈的基本操作:
空栈、入栈、出栈、取栈顶元素;
实现十进制数与八进制数的转换,十进制数与十六进制数的转换和任意进制之间的转换;
定义链式队列,完成队列的基本操作:
入队和出队;
1.问题描述:
(1)利用栈的顺序存储结构,设计一组输入数据(假定为一组整数),能够对顺序栈进行如下操作:
∙初始化一个空栈,分配一段连续的存储空间,且设定好栈顶和栈底;
∙完成一个元素的入栈操作,修改栈顶指针;
∙完成一个元素的出栈操作,修改栈顶指针;
∙读取栈顶指针所指向的元素的值;
∙将十进制数N和其它d进制数的转换是计算机实现计算的基本问题,其解决方案很多,其中最简单方法基于下列原理:
即除d取余法。
例如:
(1348)10=(2504)8
NNdiv8Nmod8
13481684
168210
2125
202
从中我们可以看出,最先产生的余数4是转换结果的最低位,这正好符合栈的特性即后进先出的特性。
所以可以用顺序栈来模拟这个过程。
以此来实现十进制数与八进制数的转换,十进制数与十六进制数的转换;
编写主程序,实现对各不同的算法调用。
(2)利用队列的链式存储结构,设计一组输入数据(假定为一组整数),能够对链式队列进行如下操作:
∙初始化一个空队列,形成一个带表头结点的空队;
∙完成一个元素的入队操作,修改队尾指针;
∙完成一个元素的出队操作,修改队头指针;
修改主程序,实现对各不同的算法调用。
2.实现要求:
对顺序栈的各项操作要编写成为C(C++)语言函数,组合成模块化的形式,每个算法的实现要从时间复杂度和空间复杂度上进行评价。
∙“初始化栈算法”操作结果:
构造一个空栈S;
∙“销毁栈算法”操作结果:
销毁栈S,S不再存在;
∙“置空栈算法”操作结果:
把S置为空栈;
∙“判是否空栈算法”操作结果:
若栈S为空栈,则返回TRUE,否则返回FALSE;
∙“求栈的长度算法”操作结果:
返回S的元素个数,即栈的长度;
∙“取栈顶元素算法”操作结果:
若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR;
∙“入栈算法”操作结果:
插入元素e为新的栈顶元素
∙“出栈算法”操作结果:
若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
∙“实现十进制数与八进制数的转换算法”操作结果:
输入任意一个非负的十进制数,输出对应的八进制数;
∙“实现十进制数与十六进制数的转换算法”操作结果:
输入任意一个非负的十进制数,输出对应的十六进制数;
对链式队列的各项操作要编写成为C(C++)语言函数,组合成模块化的形式,每个算法的实现要从时间复杂度和空间复杂度上进行评价。
∙“初始化空队算法”操作结果:
构造一个空队列Q;
∙“销毁队列算法”操作结果:
销毁队列Q(无论空否均可);
∙“空队列算法”操作结果:
将Q清为空队列;
∙“判队列是否为空算法”操作结果:
若Q为空队列,则返回TRUE,否则返回FALSE;
∙“求队列的长度算法”操作结果:
求队列的长度,返回队列中结点的个数;
∙“取队头元素算法”操作结果:
若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR;
∙“入队算法”操作结果:
插入元素e为Q的新的队尾元素;
∙“出队算法”操作结果:
若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR;
3、实验指导
(一)顺序栈的实验指导
1.首先将顺序栈存储结构定义放在一个头文件:
如取名为SqStackDef.h。
2.将顺序栈的基本操作算法也集中放在一个文件之中,如取名为SqStackAlgo.h。
如:
InitStack、DestroyStack、ClearStack、StackEmpty、StackLength、GetTop、Push、Pop、conversion10_8、conversion10_16等。
3.将函数的测试和主函数组合成一个文件,如取名为SqStackUse.cpp。
(二)链式队列的实验指导
1.首先将链式队列的存储结构定义放在一个头文件:
如取名为LinkQueueDef.h。
2.将链式队列的基本操作算法也集中放在一个文件之中,如取名为LinkQueueAlgo.h。
如:
InitQueue、DestroyQueue、ClearQueue、QueueEmpty、QueueLength、GetHead_Q、EnQueue、DeQueue、QueueTraverse等。
3.将函数的测试和主函数组合成一个文件,如取名为LinkQueueUse.cpp。
4、基本实验的参考程序
(一)顺序栈
1.文件SqStackDef.h中实现了栈的顺序存储表示
#defineSTACK_INIT_SIZE10/*存储空间初始分配量*/
#defineSTACKINCREMENT2/*存储空间分配增量*/
typedefstructSqStack
{
SElemType*base;/*在栈构造之前和销毁之后,base的值为NULL*/
SElemType*top;/*栈顶指针*/
intstacksize;/*当前已分配的存储空间,以元素为单位*/
}SqStack;/*顺序栈*/
2.文件SqStackAlgo.h中实现顺序栈的基本操作(存储结构由SqStackDef.h定义)
StatusInitStack(SqStack&S)
{/*构造一个空栈S*/
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!
S.base)
exit(OVERFLOW);/*存储分配失败*/
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
returnOK;
}
StatusDestroyStack(SqStack&S)
{/*销毁栈S,S不再存在*/
free(S.base);
S.base=NULL;
S.top=NULL;
S.stacksize=0;
returnOK;
}
StatusClearStack(SqStack&S)
{/*把S置为空栈*/
S.top=S.base;
returnOK;
}
StatusStackEmpty(SqStackS)
{/*若栈S为空栈,则返回TRUE,否则返回FALSE*/
if(S.top==S.base)
returnTRUE;
else
returnFALSE;
}
intStackLength(SqStackS)
{/*返回S的元素个数,即栈的长度*/
returnS.top-S.base;
}
StatusGetTop(SqStackS,SElemType&e)
{/*若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR*/
if(S.top>S.base)
{
e=*(S.top-1);
returnOK;
}
else
returnERROR;
}
StatusPush(SqStack&S,SElemTypee)
{/*插入元素e为新的栈顶元素*/
if(S.top-S.base>=S.stacksize)/*栈满,追加存储空间*/
{
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!
S.base)
exit(OVERFLOW);/*存储分配失败*/
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*(S.top)++=e;
returnOK;
}
StatusPop(SqStack&S,SElemType&e)
{/*若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR*/
………(将函数补充完整)
}
StatusStackTraverse(SqStackS,Status(*visit)(SElemType))
{/*从栈底到栈顶依次对栈中每个元素调用函数visit()。
*/
/*一旦visit()失败,则操作失败*/
while(S.top>S.base)
visit(*S.base++);
printf("\n");
returnOK;
}
voidconversion10_8()/*算法3.1*/
{/*对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数*/
SqStacks;
unsignedn;/*非负整数*/
SElemTypee;
InitStack(s);/*初始化栈*/
printf("Enterannumber(>=0):
");
scanf("%u",&n);/*输入非负十进制整数n*/
while(n)/*当n不等于0*/
{
………(将程序补充完整)
}
while(!
StackEmpty(s))/*当栈不空*/
{
………(将程序补充完整)
}
printf("\n");
}
voidconversion10_16()
{/*对于输入的任意一个非负10进制整数,打印输出与其等值的16进制数*/
SqStacks;
unsignedn;/*非负整数*/
SElemTypee;
InitStack(s);/*初始化栈*/
printf("Enterannumber(>=0):
");
scanf("%u",&n);/*输入非负十进制整数n*/
while(n)/*当n不等于0*/
{
………(将程序补充完整)
}
while(!
StackEmpty(s))/*当栈不空*/
{
………(将程序补充完整)
}
printf("\n");
}
3.在SqStackUse.cpp文件中,测试算法3.1的调用,其中间接调用了顺序栈的其他基本算法。
typedefintSElemType;/*定义栈元素类型为整型*/
#include"pubuse.h"/*常量定义与系统函数原型声明,与实验一中的相同*/
#include"SqStackDef.h"/*采用顺序栈的类型定义*/
#include"SqStackAlgo.h"/*利用顺序栈的基本操作*/
voidmain()
{conversion10_8();/*十进制数到八进制转换的验证*/
conversion10_16();/*十进制数到十六进制转换的验证*/
}
(二)链式队列
1.文件LinkQueue.h中实现单链队列--队列的链式存储结构的表示。
typedefstructQNode
{
QElemTypedata;
structQNode*next;
}QNode,*QueuePtr;
typedefstruct
{
QueuePtrfront,rear;/*队头、队尾指针*/
}LinkQueue;
2.文件LinkQueueAlgo.h中实现的链队列的基本算法,其存储结构由LinkQueueDef.h定义。
StatusInitQueue(LinkQueue&Q)
{/*构造一个空队列Q*/
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!
Q.front)
exit(OVERFLOW);
Q.front->next=NULL;
returnOK;
}
StatusDestroyQueue(LinkQueue&Q)
{/*销毁队列Q(无论空否均可)*/
while(Q.front)
{
Q.rear=Q.front->next;
free(Q.front);
Q.front=Q.rear;
}
returnOK;
}
StatusClearQueue(LinkQueue&Q)
{/*将Q清为空队列*/
QueuePtrp,q;
Q.rear=Q.front;
p=Q.front->next;
Q.front->next=NULL;
while(p)
{
q=p;
p=p->next;
free(q);
}
returnOK;
}
StatusQueueEmpty(LinkQueueQ)
{/*若Q为空队列,则返回TRUE,否则返回FALSE*/
if(Q.front==Q.rear)
returnTRUE;
else
returnFALSE;
}
intQueueLength(LinkQueueQ)
{/*求队列的长度*/
inti=0;
QueuePtrp;
p=Q.front;
while(Q.rear!
=p)
{
i++;
p=p->next;
}
returni;
}
StatusGetHead_Q(LinkQueueQ,QElemType&e)
{/*若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR*/
QueuePtrp;
if(Q.front==Q.rear)
returnERROR;
p=Q.front->next;
e=p->data;
returnOK;
}
StatusEnQueue(LinkQueue&Q,QElemTypee)
{/*插入元素e为Q的新的队尾元素*/
………(将函数补充完整)
}
StatusDeQueue(LinkQueue&Q,QElemType&e)
{/*若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR*/
………(将函数补充完整)
}
StatusQueueTraverse(LinkQueueQ,void(*visit)(QElemType))
{/*从队头到队尾依次对队列Q中每个元素调用函数visit()。
一旦visit失败,则操作失败*/
QueuePtrp;
p=Q.front->next;
while(p)
{
visit(p->data);
p=p->next;
}
printf("\n");
returnOK;
}
3.文件LinkQueueUse.cpp中包含检验LinkQueueAlgo.h中关于链式队列基本操作的声明、测试数据和主
函数。
#include"pubuse.h"/*与实验一的意义相同*/
typedefintQElemType;/*假设链式队列中的结点是一组整数*/
#include"linkqueuedef.h"
#include"linkqueuealgo.h"
voidvisit(QElemTypei)
{printf("%d",i);}
voidmain()
{
inti;
QElemTyped;
LinkQueueq;
i=InitQueue(q);
if(i)
printf("成功地构造了一个空队列!
\n");
printf("是否空队列?
%d(1:
空0:
否)",QueueEmpty(q));
printf("队列的长度为%d\n",QueueLength(q));
EnQueue(q,-5);
EnQueue(q,5);
EnQueue(q,10);
printf("插入3个元素(-5,5,10)后,队列的长度为%d\n",QueueLength(q));
printf("是否空队列?
%d(1:
空0:
否)",QueueEmpty(q));
printf("队列的元素依次为:
");
QueueTraverse(q,visit);
i=GetHead_Q(q,d);
if(i==OK)
printf("队头元素是:
%d\n",d);
DeQueue(q,d);
printf("删除了队头元素%d\n",d);
i=GetHead_Q(q,d);
if(i==OK)
printf("新的队头元素是:
%d\n",d);
ClearQueue(q);
printf("清空队列后,q.front=%uq.rear=%uq.front->next=%u\n",q.front,q.rear,q.front->next);
DestroyQueue(q);
printf("销毁队列后,q.front=%uq.rear=%u\n",q.front,q.rear);
}
5、实验环境和实验步骤
(一)基本实验的实验步骤:
(顺序栈的定义以及应用)
1.启动VC++;
2.新建工程/Win32ConsoleApplication,选择输入位置:
如“d:
\”,输入工程的名称:
如“SqStackDemo”;按“确定”按钮,选择“AnEmptyProject”,再按“完成”按钮;
3.加载实验一中的pubuse.h选中菜单的“project”.“addtoproject”.“files”选择已存在文件,确定,然后一定将文件pubuse.h拷贝到所建的工程目录下;
4.新建文件/C/C++HeaderFile,选中“添加到工程的复选按钮”,输入文件名“SqStackDef.h”,按“确定”按钮,在显示的代码编辑区内输入如上的参考程序;
5.新建文件/C/C++HeaderFile,选中“添加到工程的复选按钮”,输入文件名“SqStackAlgo.h”,按“确定”按钮,在显示的代码编辑区内输入如上的参考程序;
6.新建文件/C++SourceFile,选中“添加到工程的复选按钮”,输入文件名“SqStackUse.cpp”,按“确定”按钮,在显示的代码编辑区内输入如上的参考程序;
7.构件、调试、运行与实验一相同,在此不再复述;
(二)基本实验的实验步骤:
(链式队列定义以及应用)
1.启动VC++;
2.新建工程/Win32ConsoleApplication,选择输入位置:
如“d:
\”,输入工程的名称:
如“LinkQueueDemo”;按“确定”按钮,选择“AnEmptyProject”,再按“完成”按钮;
3.加载实验一中的pubuse.h选中菜单的”project”--“addtoproject”--“files”选择已存在文件,确定,然后一定将文件pubuse.h拷贝到所建的工程目录下;
4.新建文件/C/C++HeaderFile,选中“添加到工程的复选按钮”,输入文件名“LinkQueueDef.h”,按“确定”按钮,在显示的代码编辑区内输入如上的参考程序;
5.新建文件/C/C++HeaderFile,选中“添加到工程的复选按钮”,输入文件名“LinkQueueAlgo.h”,按“确定”按钮,在显示的代码编辑区内输入如上的参考程序;
6.新建文件/C++SourceFile,选中“添加到工程的复选按钮”,输入文件名“LinkQueueUse.cpp”,按“确定”按钮,在显示的代码编辑区内输入如上的参考程序;
7.构件、调试、运行与实验一相同,在此不再复述;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 队列
![提示](https://static.bdocx.com/images/bang_tan.gif)