版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数据结构与算法设计实验报告实验二学院: 班级: 学号: 姓名: 一、实验目的 1. 通过实验实践、巩固栈的相关操作;2. 熟悉vc环境,加强编程、调试的练习;3. 用c语言实现栈的抽象数据类型,实现栈的建立、进栈、出栈、取数据等基本操作;4. 用c语言实现判断运算符优先级、表达式求值等基本操作;5. 理论知识与实际问题相结合,利用上述基本操作实现简单计算器。二、实验内容 1、简单计算器。请按照四则运算加、减、乘、除、幂()和括号的优先关系和惯例,编写计算器程序。要求: 从键盘输入一个完整的表达式,以回车作为表达式输入结束的标志。 输入表达式中的数值均为大于等于零的整数。中间的计算过程如果出现小
2、数也只取整。例如,输入:4+2*5=输出:14 输入:(4+2)*(2-10)=输出:-48三、程序设计 1、概要设计为实现上述程序功能,应用栈存储运算符和操作数,为此需要建立一个抽象数据类型:栈。(1)、栈的抽象数据类型定义为:adt stack 数据对象:d=ai|aielemset,i=1,2,3,n,n0数据关系:r1= <ai-1,ai>|aid,i=1,2,n基本操作:initstack(&s)操作结果:创建一个空栈s。push(&s, e)初始条件:栈s已存在操作结果:插入运算符e作为新的栈顶元素gettop(&s)初始条件:栈s已存在且非空操
3、作结果:用e返回寄存运算符栈s的栈顶元素pop(&s,&e)初始条件:栈s已存在且非空操作结果:删除寄存运算符栈s的栈顶元素operate(a,theta,b)初始条件:a,b为整数,theta为运算符操作结果:返回a与b运算的结果 precede(d,c)初始条件:d,c为运算符 操作结果:若d优先级大于c,返回>;若d优先级小于c,返回<;若d优先级等于c,返回=; evaluateexpression()初始条件:输入合法的表达式操作结果:返回表达式的值adt stack主程序流程调用evaluateexpression()函数计算表达式的值,并将结果输出在屏
4、幕上。各函数模块的调用关系先由主函数调用计算求值函数;再由求值模块调用栈构造函数,构造两个栈分别用来保存操作数和运算符,然后根据情况多次调用进栈、出栈、取栈顶元素、判断运算符优先级、计算表达式的值等多个函数,计算并返回表达式的值;最后由主函数在屏幕上输出表达式的结果。流程图开始'='作为运算符栈的栈底元素字符c!='='|gettop1(optr)!='='?c='+'|c='-'|c='*'|c='/'|c=''|c='('|c=')'
5、;|c='='?case<:操作符入栈case=:符号出栈case>:操作数栈栈顶2个数运算输入c结束c进入操作数栈返回运算结果输出运算结果yyn 2、详细设计 (1)、宏定义#define stack_init_size 10 / 栈存储空间的初始分配量#define stackincrement 10 / 空间的分配增量#define ok 1 / 正确时返回值为真#define error 0 / 出错时返回值为假(2)、抽象数据类型定义typedef char elemtype1;/定义元素类型1为chartypedef int elemtype2;/定义元
6、素类型2为inttypedef struct/栈sqstack1存储元素为char elemtype1 *base; /栈空间基址 elemtype1 *top; /栈顶指针 int stacksize; /当前分配的栈空间大小sqstack1;typedef struct/栈sqstack2存储元素为int elemtype2 *base; /栈空间基址 elemtype2 *top; /栈顶指针 int stacksize; /当前分配的栈空间大小sqstack2;(3)、操作算法程序实现:int initstack1( sqstack1 &s ) /构造一个空栈s s.base
7、= ( elemtype1 *)malloc( stack_init_size * sizeof(elemtype1) ); /为顺序栈动态分配存储空间 if ( ! s. base) exit(overflow); /分配失败 s.top = s.base; s.stacksize = stack_init_size; return ok; / initstack1int push1( sqstack1 &s, elemtype1 e ) /将元素e插入栈中,使其成为新的栈顶元素 if ( s.top-s.base>=s.stacksize ) / 若栈满则追加存储空间 s.b
8、ase = (elemtype1 * ) realloc ( s.base,(s.stacksize +stackincrement) * sizeof(elemtype1); if ( ! s. base ) exit(overflow); /存储分配失败 s.top = s.base + s.stacksize; s.stacksize += stackincrement; * s.top + = e; /元素e 插入栈顶,后修改栈顶指针 return ok; / *s.top=e; s.top +; /push1char gettop1( sqstack1 s)/取栈顶元素并返回其值el
9、emtype1 e; if ( s.top=s.base ) return error; /栈空 e = *(s.top-1); return e; /gettop1int pop1 ( sqstack1 &s, elemtype1 &e )/删除栈顶元素,并用e返回其值if ( s.top=s.base ) return error; / 栈空 e = * - s.top; / -s.top; e=*s.top; return ok; /pop1int initstack2( sqstack2 &s ) /构造一个空栈s s.base = ( elemtype2 *)
10、malloc( stack_init_size * sizeof(elemtype2) ); /为顺序栈动态分配存储空间 if ( ! s. base) exit(overflow); /分配失败 s.top = s.base; s.stacksize = stack_init_size; return ok; / initstack2int push2( sqstack2 &s, elemtype2 e ) /将元素e插入栈中,使其成为新的栈顶元素 if ( s.top-s.base>=s.stacksize ) / 若栈满则追加存储空间 s.base = (elemtype2
11、 * ) realloc ( s.base,(s.stacksize +stackincrement) * sizeof(elemtype2); if ( ! s. base ) exit(overflow); /存储分配失败 s.top = s.base + s.stacksize; s.stacksize += stackincrement; * s.top + = e; /元素e 插入栈顶,后修改栈顶指针 return ok; / *s.top=e; s.top +; /push2int gettop2( sqstack2 s)/取栈顶元素并返回其值elemtype2 e;if ( s.
12、top=s.base ) return error; /栈空 e = *(s.top-1); return e; /gettop2int pop2 ( sqstack2 &s, elemtype2 &e )/删除栈顶元素,并用e返回其值if ( s.top=s.base ) return error; / 栈空 e = * - s.top; / -s.top; e=*s.top; return ok; /pop2int in (char c)/判断c是否为运算符,是则返回1,否则返回0。if(c='+'|c='-'|c='*'|c
13、='/'|c=''|c='('|c=')'|c='=')return 1;elsereturn 0; /inchar precede(char d,char c)/判断运算符d与运算符c的优先级switch(c)case'+':switch(d)case'+':return '>'break;case'-':return '>'break;case'*':return '>'break;
14、case'/':return '>'break;case'':return '>'break;case'(':return '<'break;case')':return '>'break;case'=':return '<'break;case'-':switch(d)case'+':return '>'break;case'-':re
15、turn '>'break;case'*':return '>'break;case'/':return '>'break;case'':return '>'break;case'(':return '<'break;case')':return '>'break;case'=':return '<'break;case'*':sw
16、itch(d)case'+':return '<'break;case'-':return '<'break;case'*':return '>'break;case'/':return '>'break;case'':return '>'break;case'(':return '<'break;case')':return '>'
17、;break;case'=':return '<'break;case'/':switch(d)case'+':return '<'break;case'-':return '<'break;case'*':return '>'break;case'/':return '>'break;case'':return '>'break;case'(&
18、#39;:return '<'break;case')':return '>'break;case'=':return '<'break;case'':switch(d)case'+':return '<'break;case'-':return '<'break;case'*':return '<'break;case'/':return '&
19、lt;'break;case'':return '>'break;case'(':return '<'break;case')':return '>'break;case'=':return '<'break;case'(':switch(d)case'+':return '<'break;case'-':return '<'break;case
20、'*':return '<'break;case'/':return '<'break;case'':return '<'break;case'(':return '<'break;case'=':return '<'break;case')':switch(d)case'+':return '>'break;case'-':return
21、 '>'break;case'*':return '>'break;case'/':return '>'break;case'':return '>'break;case'(':return '='break;case')':return '>'break;case'=':switch(d)case'+':return '>'break;
22、case'-':return '>'break;case'*':return '>'break;case'/':return '>'break;case'':return '>'break;case')':return '>'break;case'=':return '='break; /precedeint operate(int a,char theta,int b)/运
23、算函数switch(theta)case'+':return (a+b);case'-':return (a-b);case'*':return (a*b);case'/':return (a/b);case'':return (pow(a,b);/operateint evaluateexpression( ) /算术表达式求值的算符优先算法。设optr和opnd分别为运算符栈和操作数栈,op为运算符、界限符集合。char c,theta;int num,a,b;sqstack1 optr;sqstack2 op
24、nd;initstack1(optr);initstack2(opnd);push1(optr,'=');c=getchar( );while (c!='='|gettop1(optr)!='=') num = 0;if (! in(c) / in(c)判断c是否为运算符 while(!in(c)num*=10;num+=(c-48);c=getchar();push2(opnd, num); /不是运算符则进栈elseswitch (precede(gettop1(optr),c) /判定optr的栈顶运算符1与读入的运算符2间的优先关系cas
25、e '<': / 新输入的算符c优先级高,c进栈push1(optr, c); c=getchar( ); break;case '=': / 脱括号并接收下一字符pop1(optr, c); c=getchar( ); break;case '>': /新输入的算符c优先级低,即栈顶算符优先权高/出栈并将运算结果入栈opndpop1( optr, theta);pop2( opnd, b);pop2( opnd, a);push2( opnd, operate(a, theta, b) ); /进行二元运算a theta bbrea
26、k; /switch /whilereturn gettop2(opnd); /evaluateexpression(4)、主程序的代码实现:int main()int x; /定义整形变量x用以接受表达式的值x=evaluateexpression(); /返回表达式的值printf("%dn",x);/输出表达式的值return 0;四、程序调试分析 1. 引用标识符&不符合c语言语法,应使用c+;2. 存操作数和运算符的栈元素类型不一样,所以要定义两种元素类型、两种栈以及分别对应的基本操作;3. 操作数进栈时要注意连续读完所有非运算符的字符并且把字符型转换为整
27、型;4. pow()函数返回值为double,直接取整会丢失数据,组建时会有警告提示。五、 用户使用说明 1. 本程序的运行环境为dos操作系统,执行文件为:实验二.exe,双击打开文件。2. 进入程序后,输入要计算的表达式,按enter键结束。3. 屏幕输出上述表达式的结果,按任意键退出程序。六、程序运行结果测试一: 测试二:测试三:七、程序清单#include <stdio.h>#include <stdlib.h>#include <math.h>typedef char elemtype1;/定义元素类型1为chartypedef int elemt
28、ype2;/定义元素类型2为int#define stack_init_size 10 / 栈存储空间的初始分配量#define stackincrement 10 / 空间的分配增量#define ok 1 / 正确时返回值为真#define error 0 / 出错时返回值为假typedef struct/栈sqstack1存储元素为charelemtype1 *base; /栈空间基址elemtype1 *top; /栈顶指针int stacksize; /当前分配的栈空间大小sqstack1;typedef struct/栈sqstack2存储元素为intelemtype2 *base
29、; /栈空间基址elemtype2 *top; /栈顶指针int stacksize; /当前分配的栈空间大小sqstack2;int initstack1( sqstack1 &s ) /构造一个空栈s s.base = ( elemtype1 *)malloc( stack_init_size * sizeof(elemtype1) ); /为顺序栈动态分配存储空间 if ( ! s. base) exit(overflow); /分配失败 s.top = s.base; s.stacksize = stack_init_size; return ok; / initstack1i
30、nt push1( sqstack1 &s, elemtype1 e ) /将元素e插入栈中,使其成为新的栈顶元素 if ( s.top-s.base>=s.stacksize ) / 若栈满则追加存储空间 s.base = (elemtype1 * ) realloc ( s.base,(s.stacksize +stackincrement) * sizeof(elemtype1); if ( ! s. base ) exit(overflow); /存储分配失败 s.top = s.base + s.stacksize; s.stacksize += stackincrem
31、ent; * s.top + = e; /元素e 插入栈顶,后修改栈顶指针 return ok; / *s.top=e; s.top +; /push1char gettop1( sqstack1 s)/取栈顶元素并返回其值elemtype1 e; if ( s.top=s.base ) return error; /栈空 e = *(s.top-1); return e; /gettop1int pop1 ( sqstack1 &s, elemtype1 &e )/删除栈顶元素,并用e返回其值if ( s.top=s.base ) return error; / 栈空 e =
32、 * - s.top; / -s.top; e=*s.top; return ok; /pop1int initstack2( sqstack2 &s ) /构造一个空栈s s.base = ( elemtype2 *)malloc( stack_init_size * sizeof(elemtype2) ); /为顺序栈动态分配存储空间 if ( ! s. base) exit(overflow); /分配失败 s.top = s.base; s.stacksize = stack_init_size; return ok; / initstack2int push2( sqstac
33、k2 &s, elemtype2 e ) /将元素e插入栈中,使其成为新的栈顶元素 if ( s.top-s.base>=s.stacksize ) / 若栈满则追加存储空间 s.base = (elemtype2 * ) realloc ( s.base,(s.stacksize +stackincrement) * sizeof(elemtype2); if ( ! s. base ) exit(overflow); /存储分配失败 s.top = s.base + s.stacksize; s.stacksize += stackincrement; * s.top + =
34、 e; /元素e 插入栈顶,后修改栈顶指针 return ok; / *s.top=e; s.top +; /push2int gettop2( sqstack2 s)/取栈顶元素并返回其值elemtype2 e;if ( s.top=s.base ) return error; /栈空 e = *(s.top-1); return e; /gettop2int pop2 ( sqstack2 &s, elemtype2 &e )/删除栈顶元素,并用e返回其值if ( s.top=s.base ) return error; / 栈空 e = * - s.top; / -s.t
35、op; e=*s.top; return ok; /pop2int in (char c)/判断c是否为运算符,是则返回1,否则返回0。if(c='+'|c='-'|c='*'|c='/'|c=''|c='('|c=')'|c='=')return 1;elsereturn 0;/in char precede(char d,char c)/判断运算符d与运算符c的优先级switch(c)case'+':switch(d)case'+'
36、:return '>'break;case'-':return '>'break;case'*':return '>'break;case'/':return '>'break;case'':return '>'break;case'(':return '<'break;case')':return '>'break;case'='
37、:return '<'break;case'-':switch(d)case'+':return '>'break;case'-':return '>'break;case'*':return '>'break;case'/':return '>'break;case'':return '>'break;case'(':return '<&
38、#39;break;case')':return '>'break;case'=':return '<'break;case'*':switch(d)case'+':return '<'break;case'-':return '<'break;case'*':return '>'break;case'/':return '>'break;case
39、9;':return '>'break;case'(':return '<'break;case')':return '>'break;case'=':return '<'break;case'/':switch(d)case'+':return '<'break;case'-':return '<'break;case'*':return
40、39;>'break;case'/':return '>'break;case'':return '>'break;case'(':return '<'break;case')':return '>'break;case'=':return '<'break;case'':switch(d)case'+':return '<'break;c
41、ase'-':return '<'break;case'*':return '<'break;case'/':return '<'break;case'':return '>'break;case'(':return '<'break;case')':return '>'break;case'=':return '<'break;c
42、ase'(':switch(d)case'+':return '<'break;case'-':return '<'break;case'*':return '<'break;case'/':return '<'break;case'':return '<'break;case'(':return '<'break;case'=':ret
43、urn '<'break;case')':switch(d)case'+':return '>'break;case'-':return '>'break;case'*':return '>'break;case'/':return '>'break;case'':return '>'break;case'(':return '='break;case')':return '>'br
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五版奶粉生产废弃物资源化利用服务合同范本页24篇
- 2025版教育培训机构品牌授权及门店移交合同3篇
- 二零二五年度农机零部件进出口贸易合同
- 2025年度绿色环保内墙涂料工程高品质施工服务合同4篇
- 二零二五年度面粉原料进口关税减免申请合同4篇
- 二零二五年度二手房买卖合同补充条款协议书(含交易透明)3篇
- 二零二五年度文化演出活动赞助合同正规范本
- 二零二四年度婴幼儿专用奶粉代理权租赁合同范本3篇
- 二零二五年度企业人力资源战略规划与实施合同范本9篇
- 2025年度个人与个人艺术品拍卖合同范本4篇
- 江西省部分学校2024-2025学年高三上学期1月期末英语试题(含解析无听力音频有听力原文)
- 农民工工资表格
- 【寒假预习】专题04 阅读理解 20篇 集训-2025年人教版(PEP)六年级英语下册寒假提前学(含答案)
- 2024年智能监狱安防监控工程合同3篇
- 2024年度窑炉施工协议详例细则版B版
- 幼儿园篮球课培训
- 项目监理策划方案汇报
- 《职业培训师的培训》课件
- 建筑企业新年开工仪式方案
- 一例产后出血的个案护理
- 急诊与灾难医学课件 03 呼吸困难大课何琳zhenshi
评论
0/150
提交评论