




免费预览已结束,剩余15页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验二共享栈一、设计的目的要求1、 了解栈的特性,以及它在实际问题中的应用。2、 掌握栈的实现方法以及它的基本操作,学习运用栈来解决问题。二、设计的主要内容设计两个顺序栈共享空间,试写出两个栈公用的栈操作算法push ( x,k)和 pop ( k),其中 k 为 0 或 1,用以指示栈号。编写一个完整的程序实现。三、设计的解题思路线性表( a1, a2 , an )试一种逻辑结构,若在计算机中对它采用顺序栈存储结构来存储,则就是栈表。两个栈表公用一个内存空间图示如下:024maxsize31top0top1在数据结构中用c 语言来描述,可以利用数组表示顺序表。将两个原表a 和 b 存放在一个数组的存储空间(a1 , a2 , amaxsize-1 )中,实现方法是:设置两个栈顶指针变量 top1 和 top0 ,开始时top0 = -1和 top1 = maxsize表示两个栈均为空,然后根据 变量 k 是 0 还是 1,分别进行入栈和出栈的操作。具体实现还要编写一个完整的程序,用主函数调用这里的函数来完成出入栈的操作。四、算法思路精品资料#include #include #include #include #define maxsize 10typedef int datatype; typedef structdatatype datamaxsize; int top2;sqstack;/定义一个结构体类型的sqstacksqstack a,*s;/ 定义一个结构体类型变量a和指针变量 sssqstack *init(sqstack *s)/ 初始化两个栈均为空,s是指向栈类型的指针s=(sqstack *)malloc(sizeof(sqstack);/ 申请空间s-top0=-1;/top1 、top0 分别是第 0 和第 1个栈的栈顶指针s-top1=maxsize; return s;int push(sqstack *s,datatype x,int k)/ 入栈操作, s是栈顶指针, x是要插入的数, k是栈号if(s-top0+1=s-top1)printf(n);printf( 两个栈均满,不能进栈!n); / 判断是否栈满return 0;if(k=0)s-topk+;/ 改栈顶指针加1或减 1 ,来选择不满的栈elses-topk-;s-datas-topk=x;/将x 插入当前栈顶return 1;int pop(sqstack *s,int k)/ 出栈操作,栈顶元素由参数x返回int x;if(k=0&s-top0=-1)|(k=1&s-top1=maxsize)printf( 栈空 ,不能退栈! nn); return 0;x=s-datas-topk;/区栈顶元素给x if(k=0)s-topk-;/ 改栈顶指针加1 或减 1 ,来选择不满的栈elses-topk+; return x;void get(sqstack *s,int l)/元素输入函数,l来判断是否已经建栈int k=0,x;while(k=1|k=0)if(l=0)printf( 栈还未建立!n); break;elseprintf( 请选择输入方向,正向(0) ,方向 (1) ,结束 (2):);/ 选择要输入的栈号,并输入元素scanf(%d,&k);printf(n); if(k=0|k=1)x=0;printf( 请输入数据:); while(x!=-1)scanf(%d,&x); if(x=-1)break;push(s,x,k);printf(n);elsebreak;void check(sqstack *s)/ 检测栈内的元素但并不输出int i,l=0; while(l=0|l=1)printf( 请选择输出方向,正向(0) ,方向 (1) ,结束 (2):); scanf(%d,&l);printf(n); if(l=2) break;else if(l=0&s-top0=-1)|(l=1&s-top1=maxsize)printf( 栈空 ,不能退栈! nn); continue;else if(l=0)printf( 正向数据为:); for(i=0;itopl;i+)printf(%4d,s-datai); printf(nn);elseprintf( 反向数据为:); for(i=maxsize-1;i=s-topl;i-)printf(%4d,s-datai); printf(nn);void print(sqstack *s)/元素输出函数int x,z=1,f=1,l=0; while(l=0|l=1)printf( 请选择输出方向,正向(0) ,方向 (1):); scanf(%d,&l);printf(n);x=pop(s,l); if(x=0)printf( 选择 1继续 ,0 结束输出: ); scanf(%d,&l);printf(n); if(l=1) continue; else break; printf(n);else if(l=0)printf( 正向第 %d 个: %dn,z,x); z+;printf(printf(n);elseprintf( 反向第 %d 个: %dn,f,x); f+;printf(n);void menu()/ 菜单函数printf(栈的共享实验n ); printf(=n);printf( 1. 栈 的 建 立 n ); printf( 2. 栈的共享输入 n ); printf( 3. 栈单个的输出 n ); printf( 4. 栈的检测 n );printf( 0. 退 出 实 验 n ); printf(=n );精品资料voidmain()/ 主函数int h,k,l=0;/定义 l为标志,判断是否已建栈,如未建立l=0 ,否则l=1char i; sqstack *s; for(;)menu();printf(请选择0-4 : );scanf(%d,&h); if(h4)printf(n 输 人 错 误 ! n ); printf(enter y to contunie :); scanf(%s,&i);system(cls); continue;else switch(h)case 1:system(cls); printf(*n); printf(*栈的建立 *n);printf(*n);printf(n);s=init(s);/栈的建立printf(enter y to contunie :); scanf(%s,&i);printf(n); l=1;system(cls); break;case2:system(cls); printf(*n); printf(*栈的共享输入*n); printf(*n );get(s,l);/ 栈的输入printf(n);printf(enter y to contunie :);scanf(%s,&i);printf(n);system(cls); break;case3:system(cls); printf(*n ); printf(*栈单个的输出* n); printf(*n );print(s);/ 栈的单个输出printf(n);system(cls); break;case4:system(cls); printf(*n ); printf(*栈的检测 * n);printf(*n );check(s);/对栈内元素的检测printf(n);system(cls); break;case0: system(cls);printf(*再 见! *n); printf(n);return 0;五、运算结果1.栈的建立2.栈的共享输入3.栈单个的输出4.栈的检测0.退 出 实 验请 选 择0-4 : 1 (回车)* 栈 的 建 立 *结果一: 0 号栈输入元素(1 ,2, 3, 4 , 7, 8, 10), 1 号栈输入元素(0,5 , 6 )栈的共享实验entery tocontinue: y(回车)* 栈 的 共 享 输 入 *请选择输入方向,正向(0) ,方向请输入数据: 1 2 3 4 7 8 101(1) ,结束 (2): 0(回车)(回车)请选择输入方向,正向(0) ,方向(1) ,结束 (2): 1(回车)请输入数据: 0 5 6 1(回车)请选择输入方向,正向(0) ,方向(1) ,结束 (2): 2(回车)entery tocontinue: y(回车)* 栈 的 检 测 *请选择输入方向,正向(0) ,方向(1) ,结束 (2): 0(回车)正向数据为: 1 2 3 4 7 8 10请选择输入方向,正向(0) ,方向(1) ,结束 (2): 1(回车)反向数据为: 0 5 6请选择输入方向,正向(0) ,方向(1) ,结束 (2): 2(回车)* 栈 的 单 个 输 出 *请选择输出方向,正向(0) ,方向 (1): 0(回车)正向第 1 个: 10请选择输出方向,正向(0) ,方向 (1): 0正向第 2 个: 8(回车)请选择输出方向,正向(0) ,方向 (1): 0(回车)正向第 3 个: 17请选择输出方向,正向(0) ,方向 (1): 0(回车)正向第 4 个: 4请选择输出方向,正向(0) ,方向 (1): 0(回车)正向第 5 个: 3请选择输出方向,正向(0) ,方向 (1): 0(回车)正向第 6 个: 2请选择输出方向,正向(0) ,方向 (1): 0正向第 7 个: 1(回车)请选择输出方向,正向(0) ,方向 (1): 0(回车)栈空,不能退栈!选择 1 继续,0 结束输出: 1(回车)请选择输出方向,正向(0) ,方向 (1): 1反向第 1 个: 6(回车)请选择输出方向,正向(0) ,方向 (1): 1(回车)反向第 2 个: 5请选择输出方向,正向(0) ,方向 (1): 1(回车)反向第 3 个: 0请选择输出方向,正向(0) ,方向 (1): 1(回车)栈空,不能退栈!选择 1 继续,0 结束输出: 0(回车)栈的共享实验5.栈的建立6.栈的共享输入7.栈单个的输出8.栈的检测1.退 出 实 验请 选 择0-4 : 0 (回车)* 再 见 *按任意键继续结果二:还未建立栈就输入数据栈的共享实验1. 栈的建立2. 栈的共享输入3. 栈单个的输出4. 栈的检测0.退出实 验请选择0-4 : 2 (回车)* 栈 的 共 享 输 入 *栈还未建立!entery tocontinue: y(回车)结果三:输入的数据过多时栈的共享实验1. 栈的建立2. 栈的共享输入3. 栈单个的输出4. 栈的检测0.退 出 实 验请 选 择0-4 : 1 (回车)* 栈 的 建 立 *entery tocontinue: y(回车)* 栈 的 共 享 输 入 *请选择输入方向,正向(0) ,方向 (1) ,结束 (2): 0(回车)请输入数据: 1 2 3 4 5 6 7 8 9 10 111(回车) 两栈均满,不能进栈!请选择输入方向,正向(0) ,方向 (1) ,结束 (2): 2(回车)entery tocontinue: y(回车)六、调试小结函数 init (sqstack *s)中少了一条s=(sqstack *)malloc(sizeof(sqstack)语句, 这就导致了栈的内存空间无法分配,所以执行出错。在程序中多加了get (sqstack *s,int l)、check (sqstack *s)、print (sqstack *s)三个函数以便与栈的输入输出以及对栈的检测(不出栈)。为了在栈的输入之前判断是否已经建栈,在主函数中定义了一个l 并定义为 0,当 l = 0时表示还未建栈,l = 1时表示已经建栈。所以只要将l 的值传入get (sqstack *s,int l)函数中就可以判断在此之前是否已经建栈。七、疑问对标志 l 的赋值只能放在建栈
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 低温保存对生物样本的影响研究
- 彩铅公鸡课件
- 硬笔规范字知识培训课件
- 2025广东广州市中山大学孙逸仙纪念医院康复医学科医教研岗位和医技岗位招聘2人模拟试卷及参考答案详解一套
- 申祥人体知识培训班课件
- 25秋人教版六年级英语上册Unit 6 How do you feel第1课时教案(练习无答案)
- 2025年嘉兴市南湖区卫生健康系统公开招聘事业单位工作人员12人考前自测高频考点模拟试题及答案详解(历年真题)
- 禅城教师笔试题目及答案
- 综合教育培训考试题及答案
- 2025河南驻马店市正阳县县管国有企业招聘20人(第二批)模拟试卷及答案详解(考点梳理)
- 2025年高中语文必修上册第二单元大单元教学设计
- 2025年高考成人政治试题及答案
- 2025年护理质控标准题库及答案
- 2025年农作物植保员岗位技术基础知识考试题库附含答案
- 2025年长宁储备人才真题及答案
- 光子嫩肤课件讲解
- 人力资源中薪酬管理案例分析题及答案
- 采购业务审计培训
- 2025-2026学年冀美版(2024)小学美术二年级上册(全册)教学设计(附目录P284)
- 服装色彩构成课件
- 化工仪表检修与维护课件
评论
0/150
提交评论