1、数据结构03栈的基本操作附录 实验报告参考规范数据结构实验报告院系_ 专业 _姓名_林桢曦_ 学号_*_ 电话_ _级 _班 _年_月_日1实验题目栈的基本操作2需求分析编写栈的基本操作函数(分别用顺序和链接两种方式实现)调用进栈函数建立一个栈,读取栈顶元素,删除栈中元素,并且输出栈中所有元素。顺序栈:(1)建立空栈 int InitStack(SqStack &s)(2)进栈 void Push(SqStack &S,int e)(3)出栈 int Pop(SqStack *S,int e)(4)输出 void OutputStack(SqStack *S)链栈:(1)建立空栈void In
2、itStack(Lnode *S) (2)进栈void Push(Lnode *S, int x) (3)出栈void Pop(Lnode *S, int *x) (4)输出void OutputStack(Lnode *S)输入形式:整型数。3概要设计(1)ADT SqStack 数据对象:D=ai|aiIntegerSet,i=0,1,2,n,n0 结构关系:R=|ai,ai+1 D 基本操作: InitStack(SqStack &s) 操作前提:s是一个未初始化的顺序栈 操作结果:将s初始化为一个空的顺序栈 Push(SqStack *S, int e) 操作前提:顺序栈S已存在 操作
3、结果:将元素e插入到顺序栈中 Pop(SqStack *S,int *e) 操作前提:顺序栈S已存在 操作结果:将顺序栈S中栈顶元素删除,删除的元素值通过e返回OutputStack(SqStack *S) 操作前提:顺序栈S已存在操作结果:将顺序栈S中的元素显示到屏幕上ADT Lnode 数据对象:D=ai|aiIntegerSet,i=0,1,2,n,n0 结构关系:R=|ai,ai+1 D 基本操作: InitStack(Lnode&s) 操作前提:s是一个未初始化的链栈 操作结果:将s初始化为一个空的链栈 Push(Lnode *S, int e) 操作前提:链栈S已存在 操作结果:将
4、元素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()输出栈中元素函数
5、 OutputStack()各函数调用关系:主函数main调用其他四个函数(3)顺序栈:主函数的伪码main() 定义一个顺序栈s; 定义变量i,n,m; 初始化 s ; For循环(i=0;is.stacksize;i+)调用push函数;输出栈中元素; m=*(s.top-1);显示栈顶元素m;调用pop函数删除栈顶;显示s; 链栈:主函数的伪码main()*S=申请新结点;定义整型变量n,e,i;初始化S;显示输入链栈元素个数;输入整型数,赋给n;For循环(i=1; itop; -S-stacksize; 返回1;(4)输出元素void OutputStack(SqStack *S)
6、定义整型变量i和指向整型的指针型变量q; q=S-top-1;For(i=0;istacksize;i+)循环输出q指向的元素;q-;换行;链栈:类型定义typedef struct Lnode int data; struct Lnode *next; Lnode; 基本操作的伪码算法(1)初始化int InitStack(Lnode &s) S-next=NULL(2)进栈 void Push(Lnode &S,int x) *s=申请新的结点;如果s=NULL,显示申请失败,退出程序; s-data=x; s-next=S-next; S-next=s; (3)出栈void Pop(Ln
7、ode *S,int *x) 定义指向Lnode型指针变量p; 如果p存在,*x=S-next-data; p=S-next; S-next=p-next; 释放p的空间;(4)输出元素 void OutputStack(Lnode *S) 定义指向Lnode型指针变量p;For循环(p=S-next; p!=NULL; p=p-next)输出p-data;5调试分析顺序栈:调试是出现错误,经过检查发现在某些地方分号用中文表示。链栈:出现空指针问题,内存不能读取等6使用说明(1)顺序栈:程序名为test3.exe,程序执行过程如下:因为构造顺序栈用for循环,调用进栈函数,出栈函数是栈顶元素的
8、值,所以调用相关函数后,结果直接输出到屏幕上; (2)链栈:程序名为test3-2.exe,程序执行过程如下:提示用户输入链栈元素个数;用户按要求输入一个整型数;程序用输入的整型数构建一个链栈,并输出栈顶元素和栈中的所有元素;调用出栈函数,删除栈顶,显示栈中元素;7测试结果顺序栈:不用用户输入数值,调用函数便可得出结果,下面是程序执行结果的截图:链栈:(1)建立空链栈,程序运行后屏幕显示:输入链栈元素个数输入6后,屏幕显示建立后的链栈的 栈顶元素:6栈中元素:6 5 4 3 2 1(2)出栈 屏幕显示:删除链栈的元素 调用Pop函数之后,屏幕显示:此时栈中的元素为:5 4 3 2 1(3)退出
9、 按任意键退出程序8. 参考文献数据结构(c语言版)9附录源程序文件如下:顺序栈:#include#include#define STACKINCREMENT 100#define STACK_INIT_SIZE 10typedef struct SqStack int *base; int *top; int stacksize; SqStack;int InitStack(SqStack &s) s.base=(int *)malloc(sizeof(int); if(!s.base)exit(1); s.top=s.base; s.stacksize=STACK_INIT_SIZE; r
10、eturn 1;void Push(SqStack &S,int e) 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;int Pop(SqStack *S,int e) if(S-top=S-base)return 0; e=*-S-top; -S-stacksize; r
11、eturn 1;void OutputStack(SqStack *S) int i; int *q; q=S-top-1; for(i=0;istacksize;i+) printf(%d,*q); q=q-1; printf(n);void main() SqStack s; int i,n1=0,m=0; printf(构造一个空的顺序栈n); InitStack(s); printf(顺序栈中的元素为:); for(i=0;is.stacksize;i+) Push(s,i); OutputStack(&s); m=*(s.top-1); printf(顺序栈的栈顶元素为%dn,m);
12、 printf(删除顺序栈中的元素n此时顺序栈中的元素为:); Pop(&s,n1); OutputStack(&s);链栈:#include #include typedef struct Lnode int data; struct Lnode *next; Lnode; void InitStack(Lnode *S) S-next=NULL; void Push(Lnode *S, int x) Lnode *s=(Lnode *)malloc(sizeof(Lnode); if(s=NULL) printf(分配空间失败!n); exit(1); s-data=x; s-next=S
13、-next; S-next=s; void Pop(Lnode *S, int *x) Lnode *p; if(p) *x=S-next-data; p=S-next; S-next=p-next; free(p); void OutputStack(Lnode *S) Lnode *p;for(p=S-next; p!=NULL; p=p-next) printf(%d , p-data); void main() Lnode *S=(Lnode *)malloc(sizeof(Lnode); int n,e,i; InitStack(S); printf(输入链栈元素个数:); scan
14、f(%d, &n); for( i=1; inext-data; printf(栈顶元素:%dn, e); printf(栈中元素:); OutputStack(S); printf(n); printf(删除链栈的元素n此时栈中的元素为:); Pop(S, &e); OutputStack(S); printf(n); 注意事项:每位同学必须完成实验任务,并提交实验报告。杜绝抄袭和拷贝,一经发现该次实验雷同报告均以零分计。请将实验报告以电子文档提交, “网络工程”专业请发送到*信箱中,“电子信息”专业请发送到* 信箱中,请附上程序清单.C源程序文件、和实验报告WORD文档两部分,以打包压缩文件形式提交,每次实验为一个文件夹的打包压缩文件,文件夹名统一为*?.rar或*?.zip,其中*为你的学号(全部号码),为你中文姓名,?分别为01,02,0311表示第几次实验。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1