大数据的结构栈和队列实验报告材料Word文档格式.docx
《大数据的结构栈和队列实验报告材料Word文档格式.docx》由会员分享,可在线阅读,更多相关《大数据的结构栈和队列实验报告材料Word文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
(6)判断栈s是否非空;
(7)释放栈。
图3.1Proj3_1工程组成
本工程Proj3_1的组成结构如图3.1所示。
本工程的模块结构如图3.2所示。
图中方框表示函数,方框中指出函数名,箭头方向表示函数间的调用关系。
图3.2Proj3_1工程的程序结构图
其中包含如下函数:
InitStack(SqStack*&
s)//初始化栈S
DestroyStack(SqStack*&
s)//销毁栈s
StackEmpty(SqStack*s)//判断栈空
Push(SqStack*&
s,ElemTypee)//进栈
Pop(SqStack*&
s,ElemType&
e)//出栈
GetTop(SqStack*s,ElemType&
e)//取栈顶元素
对应的程序如下:
//文件名:
algo3-1.cpp
#include<
stdio.h>
malloc.h>
#defineMaxSize100
typedefcharElemType;
typedefstruct
{
ElemTypedata[MaxSize];
inttop;
//栈顶指针
}SqStack;
voidInitStack(SqStack*&
{s=(SqStack*)malloc(sizeof(SqStack));
s->
top=-1;
//栈顶指针置为-1
}
voidDestroyStack(SqStack*&
free(s);
boolStackEmpty(SqStack*s)//判断栈空
return(s->
top==-1);
boolPush(SqStack*&
{if(s->
top==MaxSize-1)//栈满的情况,即栈上溢出
returnfalse;
top++;
//栈顶指针增1
data[s->
top]=e;
//元素e放在栈顶指针处
returntrue;
boolPop(SqStack*&
top==-1)//栈为空的情况,即栈下溢出
e=s->
top];
//取栈顶指针元素的元素
top--;
//栈顶指针减1
}
boolGetTop(SqStack*s,ElemType&
设计exp3-1.cpp程序如下
exp3-1.cpp
//栈顶指针
externvoidInitStack(SqStack*&
s);
externvoidDestroyStack(SqStack*&
externboolStackEmpty(SqStack*s);
externboolPush(SqStack*&
s,ElemTypee);
externboolPop(SqStack*&
e);
externboolGetTop(SqStack*s,ElemType&
voidmain()
ElemTypee;
SqStack*s;
printf("
栈s的基本运算如下:
\n"
);
(1)初始化栈s\n"
InitStack(s);
(2)栈为%s\n"
(StackEmpty(s)?
"
空"
:
非空"
));
(3)依次进栈元素a,b,c,d,e\n"
Push(s,'
a'
b'
c'
d'
e'
(4)栈为%s\n"
(5)出栈序列:
while(!
StackEmpty(s))
{
Pop(s,e);
printf("
%c"
e);
}
(6)栈为%s\n"
(7)释放栈\n"
DestroyStack(s);
运行结果如下:
2)、编写一个程序algo3-2.cpp,实现链栈的各种基本运算,并在此基础上设计一个主程序并完成如下功能:
(1)初始化链栈s;
(2)判断链栈s是否非空;
(3)依次进栈a,b,c,d,e;
(4)判断链栈s是否非空;
(5)输出链栈长度;
(6)输出从栈底到栈顶元素;
(7)输出出队序列;
(8)判断链栈s是否非空;
图3.3Proj3_2工程组成
(9)释放队列。
本工程Proj3_2的组成结构如图3.3所示。
本工程的模块结构如图3.4所示。
图3.4Proj3_2工程的程序结构图
InitStack(LiStack*&
s)//初始化栈s
DestroyStack(LiStack*&
s)//销毁栈
StackEmpty(LiStack*s)//判断栈是否为空
Push(LiStack*&
Pop(LiStack*&
GetTop(LiStack*s,ElemType&
e)//取栈顶元素
对应的程序如下:
algo3-2.cpp
typedefstructlinknode
ElemTypedata;
//数据域
structlinknode*next;
//指针域
}LiStack;
voidInitStack(LiStack*&
s)//初始化栈s
{s=(LiStack*)malloc(sizeof(LiStack));
next=NULL;
voidDestroyStack(LiStack*&
{LiStack*p=s,*q=s->
next;
while(q!
=NULL)
{free(p);
p=q;
q=p->
free(p);
//此时p指向尾节点,释放其空间
boolStackEmpty(LiStack*s)//判断栈是否为空
next==NULL);
voidPush(LiStack*&
{LiStack*p;
p=(LiStack*)malloc(sizeof(LiStack));
p->
data=e;
//新建元素e对应的节点*p
next=s->
//插入*p节点作为开始节点
next=p;
boolPop(LiStack*&
if(s->
next==NULL)//栈空的情况
p=s->
//p指向开始节点
e=p->
data;
next=p->
//删除*p节点
//释放*p节点
boolGetTop(LiStack*s,ElemType&
next->
设计exp3-2.cpp主程序
exp3-2.cpp
externvoidInitStack(LiStack*&
externvoidDestroyStack(LiStack*&
externboolStackEmpty(LiStack*s);
externvoidPush(LiStack*&
externboolPop(LiStack*&
externboolGetTop(LiStack*s,ElemType&
LiStack*s;
程序运行结果如下:
3)、编写一个程序algo3-3.cpp,实现顺序环形队列的各种基本运算,并在此基础上设计一个主程序并完成如下功能:
(1)初始化队列q;
(2)判断队列q是否非空;
(3)依次进队列a,b,c;
(4)出队一个元素,输出该元素;
(5)输出队列q的元素个数;
(6)依次进队列元素d,e,f;
图3-5Proj3_3的工程组成
(7)输出队列q的元素个数;
(8)输出出队序列;
本工程Proj3_3的组成结构如图3.5所示。
本工程的模块结构如图3.6所示。
图3.6Proj3_3工程的程序结构图
InitQueue(SqQueue*&
q)//初始化队列
DestroyQueue(SqQueue*&
q)//销毁队列
QueueEmpty(SqQueue*q)//判断队列空
enQueue(SqQueue*&
q,ElemTypee)//进队
deQueue(SqQueue*&
q,ElemType&
e)//出队
algo3-3.cpp
#defineMaxSize5
intfront,rear;
//队首和队尾指针
}SqQueue;
voidInitQueue(SqQueue*&
{q=(SqQueue*)malloc(sizeof(SqQueue));
q->
front=q->
rear=0;
voidDestroyQueue(SqQueue*&
free(q);
boolQueueEmpty(SqQueue*q)//判断队列空
return(q->
front==q->
rear);
boolenQueue(SqQueue*&
if((q->
rear+1)%MaxSize==q->
front)//队满上溢出
rear=(q->
rear+1)%MaxSize;
data[q->
rear]=e;
booldeQueue(SqQueue*&
if(q->
rear)//队空下溢出
front=(q->
front+1)%MaxSize;
e=q->
front];
设计exp3-3.cpp主程序
ElemTypeelem[MaxSize];
externvoidInitQueue(SqQueue*&
q);
externvoidDestroyQueue(SqQueue*&
externboolQueueEmpty(SqQueue*q);
externboolenQueue(SqQueue*&
q,ElemTypee);
externbooldeQueue(SqQueue*&
SqQueue*q;
环形队列基本运算如下:
(1)初始化队列q\n"
InitQueue(q);
(2)依次进队列元素a,b,c\n"
if(!
enQueue(q,'
))printf("
\t提示:
队满,不能进队\n"
(3)队列为%s\n"
(QueueEmpty(q)?
if(deQueue(q,e)==0)
队空,不能出队\n"
else
(4)出队一个元素%c\n"
(5)依次进队列元素d,e,f\n"
f'
(6)出队列序列:
QueueEmpty(q))
{deQueue(q,e);
(7)释放队列\n"
DestroyQueue(q);
四、总结
从数据结构的定义看,栈和队列也是一种线性表。
其与线性表的不同之处在于栈和队列的相关运算具有特殊性,只是线性表相关运算的一个子集。
一般线性表的上的插入、删除运算不受限制,而栈和队列上的插入、删除运算受某种特殊限制。
因此。
栈和队列也称为操作受限的线性表。