数据结构03栈的基本操作.docx
《数据结构03栈的基本操作.docx》由会员分享,可在线阅读,更多相关《数据结构03栈的基本操作.docx(13页珍藏版)》请在冰豆网上搜索。
![数据结构03栈的基本操作.docx](https://file1.bdocx.com/fileroot1/2022-12/14/77f3e479-0a80-43db-870c-8cde8fb333e5/77f3e479-0a80-43db-870c-8cde8fb333e51.gif)
数据结构03栈的基本操作
附录实验报告参考规范
《数据结构》实验报告
院系____________________专业____________________
姓名_林桢曦___________学号___************_________电话____________
__________级__________班_______年____月____日
1.实验题目
栈的基本操作
2.需求分析
编写栈的基本操作函数(分别用顺序和链接两种方式实现)调用进栈函数建立一个栈,读取栈顶元素,删除栈中元素,并且输出栈中所有元素。
顺序栈:
(1)建立空栈intInitStack(SqStack&s)
(2)进栈voidPush(SqStack&S,inte)
(3)出栈intPop(SqStack*S,inte)
(4)输出voidOutputStack(SqStack*S)
链栈:
(1)建立空栈voidInitStack(Lnode*S)
(2)进栈voidPush(Lnode*S,intx)
(3)出栈voidPop(Lnode*S,int*x)
(4)输出voidOutputStack(Lnode*S)
输入形式:
整型数。
3.概要设计
(1)
ADTSqStack{
数据对象:
D={ai|ai∈IntegerSet,i=0,1,2,…,n,n≥0}
结构关系:
R={|ai,ai+1∈D}
基本操作:
InitStack(SqStack&s)
操作前提:
s是一个未初始化的顺序栈
操作结果:
将s初始化为一个空的顺序栈
Push(SqStack*S,inte)
操作前提:
顺序栈S已存在
操作结果:
将元素e插入到顺序栈中
Pop(SqStack*S,int*e)
操作前提:
顺序栈S已存在
操作结果:
将顺序栈S中栈顶元素删除,删除的元素值通过e返回
OutputStack(SqStack*S)
操作前提:
顺序栈S已存在
操作结果:
将顺序栈S中的元素显示到屏幕上
}
ADTLnode{
数据对象:
D={ai|ai∈IntegerSet,i=0,1,2,…,n,n≥0}
结构关系:
R={|ai,ai+1∈D}
基本操作:
InitStack(Lnode&s)
操作前提:
s是一个未初始化的链栈
操作结果:
将s初始化为一个空的链栈
Push(Lnode*S,inte)
操作前提:
链栈S已存在
操作结果:
将元素e插入到链栈中
Pop(Lnode*S,int*e)
操作前提:
链栈S已存在
操作结果:
将链栈S中栈顶元素删除,删除的元素值通过e返回
OutputStack(Lnode*S)
操作前提:
链栈S已存在
操作结果:
将链栈S中的元素显示到屏幕上
}
(2)顺序栈:
本程序包含6个函数:
•主函数main()
•初始化顺序栈函数InitStack()
•进栈函数Push()
•出栈函数Pop()
•输出栈中元素函数OutputStack()
各函数调用关系:
主函数main调用其他四个函数
链栈:
本程序包含6个函数:
•主函数main()
•初始化顺序栈函数InitStack()
•进栈函数Push()
•出栈函数Pop()
•输出栈中元素函数OutputStack()
各函数调用关系:
主函数main调用其他四个函数
(3)顺序栈:
主函数的伪码
main()
{定义一个顺序栈s;
定义变量i,n,m;
初始化s;
For循环(i=0;i{调用push函数;}
输出栈中元素;
m=*(s.top-1);
显示栈顶元素m;
调用pop函数删除栈顶;
显示s;
}
链栈:
主函数的伪码
main()
{*S=申请新结点;
定义整型变量n,e,i;
初始化S;
显示输入链栈元素个数;
输入整型数,赋给n;
For循环(i=1;i<=n;i++)
{调用push()函数;}
将栈顶元素赋给e;
显示栈顶元素e;
显示栈中所有元素;
换行;
调用pop函数;
显示栈中元素;
}
4.详细设计
顺序栈:
(1)类型定义
typedefstructSqStack{
int*base;
int*top;
intstacksize;
}SqStack;
基本操作的伪码算法
(1)初始化
intInitStack(SqStack&s){
*s=申请新结点;
如果申请失败,结束程序;
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
返回1;
}
(2)进栈
voidPush(SqStack&S,inte)
{如果栈满{S.base=申请新的空间;
如果申请失败,结束程序
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;}
否则*S.top++=e;
}
(3)出栈
intPop(SqStack*S,inte)
{如果栈空,返回0;
e=*--S->top;
--S->stacksize;
返回1;
}
(4)输出元素
voidOutputStack(SqStack*S)
{定义整型变量i和指向整型的指针型变量q;
q=S->top-1;
For(i=0;istacksize;i++)循环
{输出q指向的元素;
q--;
}
换行;
}
链栈:
类型定义
typedefstructLnode
{
intdata;
structLnode*next;
}Lnode;
基本操作的伪码算法
(1)初始化
intInitStack(Lnode&s){
S->next=NULL}
(2)进栈
voidPush(Lnode&S,intx)
{*s=申请新的结点;
如果s=NULL,显示申请失败,退出程序;
s->data=x;
s->next=S->next;
S->next=s;}
(3)出栈
voidPop(Lnode*S,int*x)
{定义指向Lnode型指针变量p;
如果p存在,*x=S->next->data;
p=S->next;
S->next=p->next;
释放p的空间;
}
(4)输出元素
voidOutputStack(Lnode*S)
{
定义指向Lnode型指针变量p;
For循环(p=S->next;p!
=NULL;p=p->next)
{输出p->data;}
}
5.调试分析
顺序栈:
调试是出现错误,经过检查发现在某些地方分号用中文表示。
链栈:
出现空指针问题,内存不能读取等
6.使用说明
(1)顺序栈:
程序名为test3.exe,程序执行过程如下:
因为构造顺序栈用for循环,调用进栈函数,出栈函数是栈顶元素的值,
所以调用相关函数后,结果直接输出到屏幕上;
(2)链栈:
程序名为test3-2.exe,程序执行过程如下:
提示用户输入链栈元素个数;
用户按要求输入一个整型数;
程序用输入的整型数构建一个链栈,并输出栈顶元素和栈中的所有元素;
调用出栈函数,删除栈顶,显示栈中元素;
7.测试结果
顺序栈:
不用用户输入数值,调用函数便可得出结果,下面是程序执行结果的截图:
链栈:
(1)建立空链栈,程序运行后屏幕显示:
输入链栈元素个数
输入6后,
屏幕显示建立后的链栈的栈顶元素:
6
栈中元素:
654321
(2)出栈屏幕显示:
删除链栈的元素
调用Pop函数之后,屏幕显示:
此时栈中的元素为:
54321
(3)退出按任意键退出程序
8.参考文献
数据结构(c语言版)
9.附录
源程序文件如下:
顺序栈:
#include
#include
#defineSTACKINCREMENT100
#defineSTACK_INIT_SIZE10
typedefstructSqStack{
int*base;
int*top;
intstacksize;
}SqStack;
intInitStack(SqStack&s)
{
s.base=(int*)malloc(sizeof(int));
if(!
s.base)exit
(1);
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
return1;
}
voidPush(SqStack&S,inte)
{
if(S.top-S.base>=S.stacksize){
S.base=(int*)realloc(S.base,
(S.stacksize+STACKINCREMENT)*sizeof(int));
if(!
S.base)exit
(1);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
}
intPop(SqStack*S,inte)
{
if(S->top==S->base){return0;}
e=*--S->top;
--S->stacksize;
return1;
}
voidOutputStack(SqStack*S)
{
inti;
int*q;
q=S->top-1;
for(i=0;istacksize;i++)
{
printf("%d",*q);
q=q-1;
}
printf("\n");
}
voidmain()
{
SqStacks;
inti,n1=0,m=0;
printf("构造一个空的顺序栈\n");
InitStack(s);
printf("顺序栈中的元素为:
");
for(i=0;i{
Push(s,i);
}
OutputStack(&s);
m=*(s.top-1);
printf("顺序栈的栈顶元素为%d\n",m);
printf("删除顺序栈中的元素\n此时顺序栈中的元素为:
");
Pop(&s,n1);
OutputStack(&s);
}
链栈:
#include
#include
typedefstructLnode
{
intdata;
structLnode*next;
}Lnode;
voidInitStack(Lnode*S)
{
S->next=NULL;
}
voidPush(Lnode*S,intx)
{
Lnode*s=(Lnode*)malloc(sizeof(Lnode));
if(s==NULL)
{
printf("分配空间失败!
\n");
exit
(1);
}
s->data=x;
s->next=S->next;
S->next=s;
}
voidPop(Lnode*S,int*x)
{
Lnode*p;
if(p)
*x=S->next->data;
p=S->next;
S->next=p->next;
free(p);
}
voidOutputStack(Lnode*S)
{
Lnode*p;
for(p=S->next;p!
=NULL;p=p->next)
{
printf("%d",p->data);
}
}
voidmain()
{
Lnode*S=(Lnode*)malloc(sizeof(Lnode));
intn,e,i;
InitStack(S);
printf("输入链栈元素个数:
");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
Push(S,i);
}
e=S->next->data;
printf("栈顶元素:
%d\n",e);
printf("栈中元素:
");
OutputStack(S);
printf("\n");
printf("删除链栈的元素\n此时栈中的元素为:
");
Pop(S,&e);
OutputStack(S);
printf("\n");
}
注意事项:
●每位同学必须完成实验任务,并提交实验报告。
杜绝抄袭和拷贝,一经发现该次实验雷同报告均以零分计。
●请将实验报告以电子文档提交,“网络工程”专业请发送到****************信箱中,“电子信息”专业请发送到****************信箱中,请附上程序清单.C源程序文件、和实验报告WORD文档两部分,以打包压缩文件形式提交,每次实验为一个文件夹的打包压缩文件,文件夹名统一为*⊙⊙⊙?
?
.rar或*⊙⊙⊙?
?
.zip,其中*为你的学号(全部号码),⊙⊙⊙为你中文姓名,?
?
分别为01,02,03……11表示第几次实验。