数据结构03栈的基本操作.docx

上传人:b****5 文档编号:5324249 上传时间:2022-12-15 格式:DOCX 页数:13 大小:40.05KB
下载 相关 举报
数据结构03栈的基本操作.docx_第1页
第1页 / 共13页
数据结构03栈的基本操作.docx_第2页
第2页 / 共13页
数据结构03栈的基本操作.docx_第3页
第3页 / 共13页
数据结构03栈的基本操作.docx_第4页
第4页 / 共13页
数据结构03栈的基本操作.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

数据结构03栈的基本操作.docx

《数据结构03栈的基本操作.docx》由会员分享,可在线阅读,更多相关《数据结构03栈的基本操作.docx(13页珍藏版)》请在冰豆网上搜索。

数据结构03栈的基本操作.docx

数据结构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表示第几次实验。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1