数据结构实验三栈和队列Word格式.docx
- 文档编号:17645245
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:13
- 大小:19.83KB
数据结构实验三栈和队列Word格式.docx
《数据结构实验三栈和队列Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构实验三栈和队列Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
(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不再存在*/
free(S.base);
S.base=NULL;
S.top=NULL;
S.stacksize=0;
StatusClearStack(SqStack&
{/*把S置为空栈*/
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>
e=*(S.top-1);
returnERROR;
StatusPush(SqStack&
S,SElemTypee)
{/*插入元素e为新的栈顶元素*/
if(S.top-S.base>
=S.stacksize)/*栈满,追加存储空间*/
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
*(S.top)++=e;
StatusPop(SqStack&
S,SElemType&
{/*若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;
………(将函数补充完整)
StatusStackTraverse(SqStackS,Status(*visit)(SElemType))
{/*从栈底到栈顶依次对栈中每个元素调用函数visit()。
*/
/*一旦visit()失败,则操作失败*/
while(S.top>
visit(*S.base++);
printf("
\n"
);
}
voidconversion10_8()/*算法3.1*/
{/*对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数*/
SqStacks;
unsignedn;
/*非负整数*/
SElemTypee;
InitStack(s);
/*初始化栈*/
Enterannumber(>
=0):
"
scanf("
%u"
&
n);
/*输入非负十进制整数n*/
while(n)/*当n不等于0*/
………(将程序补充完整)
while(!
StackEmpty(s))/*当栈不空*/
voidconversion10_16()
{/*对于输入的任意一个非负10进制整数,打印输出与其等值的16进制数*/
3.在SqStackUse.cpp文件中,测试算法3.1的调用,其中间接调用了顺序栈的其他基本算法。
typedefintSElemType;
/*定义栈元素类型为整型*/
#include"
pubuse.h"
/*常量定义与系统函数原型声明,与实验一中的相同*/
SqStackDef.h"
/*采用顺序栈的类型定义*/
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));
Q.front)
Q.front->
next=NULL;
StatusDestroyQueue(LinkQueue&
{/*销毁队列Q(无论空否均可)*/
while(Q.front)
Q.rear=Q.front->
next;
free(Q.front);
Q.front=Q.rear;
StatusClearQueue(LinkQueue&
{/*将Q清为空队列*/
QueuePtrp,q;
Q.rear=Q.front;
p=Q.front->
while(p)
q=p;
p=p->
free(q);
StatusQueueEmpty(LinkQueueQ)
{/*若Q为空队列,则返回TRUE,否则返回FALSE*/
if(Q.front==Q.rear)
intQueueLength(LinkQueueQ)
{/*求队列的长度*/
inti=0;
QueuePtrp;
p=Q.front;
while(Q.rear!
=p)
i++;
returni;
StatusGetHead_Q(LinkQueueQ,QElemType&
{/*若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR*/
e=p->
data;
StatusEnQueue(LinkQueue&
Q,QElemTypee)
{/*插入元素e为Q的新的队尾元素*/
StatusDeQueue(LinkQueue&
Q,QElemType&
{/*若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR*/
StatusQueueTraverse(LinkQueueQ,void(*visit)(QElemType))
{/*从队头到队尾依次对队列Q中每个元素调用函数visit()。
一旦visit失败,则操作失败*/
{
visit(p->
data);
3.文件LinkQueueUse.cpp中包含检验LinkQueueAlgo.h中关于链式队列基本操作的声明、测试数据和主
函数。
/*与实验一的意义相同*/
typedefintQElemType;
/*假设链式队列中的结点是一组整数*/
linkqueuedef.h"
linkqueuealgo.h"
voidvisit(QElemTypei)
{printf("
%d"
i);
}
inti;
QElemTyped;
LinkQueueq;
i=InitQueue(q);
if(i)
成功地构造了一个空队列!
是否空队列?
%d(1:
空0:
否)"
QueueEmpty(q));
队列的长度为%d\n"
QueueLength(q));
EnQueue(q,-5);
EnQueue(q,5);
EnQueue(q,10);
插入3个元素(-5,5,10)后,队列的长度为%d\n"
队列的元素依次为:
"
QueueTraverse(q,visit);
i=GetHead_Q(q,d);
if(i==OK)
队头元素是:
%d\n"
d);
DeQueue(q,d);
删除了队头元素%d\n"
新的队头元素是:
ClearQueue(q);
清空队列后,q.front=%uq.rear=%uq.front->
next=%u\n"
q.front,q.rear,q.front->
next);
DestroyQueue(q);
销毁队列后,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.构件、调试、运行与实验一相同,在此不再复述;
(二)基本实验的实验步骤:
(链式队列定义以及应用)
如“LinkQueueDemo”;
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”,按“确定”按钮,在显示的代码编辑区内输入如上的参考程序;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 队列