版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验四:通过栈设计一个计算器程序学 院 理学院 专 业 空间信息与数字技术 班 级 空数131 学 号 1307010160、1307010177、1307010179、1307010182 姓 名 吴廷友、佘艳云、周志妹、晏子先 实验时间: 2015年11月5日 一、 实验目的:1.熟悉栈的表示和实现方法,基于相应的表示实现;2.基于栈的各种操作,做一个简单的计算机软件。3.掌握栈各种操作,并能进行迷宫求解;二、 实验环境:软件环境:Windows XP,VC +;硬件环境:XXX计算机;三、 实验要求与提示:要求:1. 实现栈的初始化、入栈和出栈等基本操作。2. 基
2、于栈的各种操作,以及栈的表示和存储,设计一个简单的计算器应用程序。该程序能够实现计算一个表达式的值,例如能够计算类似于2.5+(3.1-1.3)*6这一类的表达式的值。最后要求使用图形化界面程序,将计算器应用程序打包成一个.exe文件。提示:基于栈的操作,计算表达式的值的算法思想: 1.对栈进行初始化操作;2.分别将表达式的值和符号放入两个栈,通过四则运算的优先级进行算法设计。即:若一个表达式为2.5+3.2*1.4,将数值和符号分别同时入栈,当遇到乘法时,就将栈顶元素以及栈顶元素的上一个元素进行出栈操作,然后将计算结果再入栈。图形化界面程序需要利用C+来实现,VC6.0中的MFC就是用来开发
3、图形化界面的。四、 算法设计及源码分析#include<stdio.h>#include<stdlib.h>#define STACK_INIT_SIZE 10#define STACKINCREMENT 10char op7='+','-','*','/','(',')','n'/运算符集合typedef struct /定义操作符结构体int *base;int *top;int stacksize;SqStack;typedef struct /定义操作
4、数结构体double *base;double *top;int stacksize;DoubleStack;void InitStack(SqStack *s)/构造一个装操作符的空栈s->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int);s->top=s->base;s->stacksize=STACK_INIT_SIZE;void InitDoubleStack(DoubleStack *s)/构造一个装操作数的空栈s->base=(double *)malloc(STACK_INIT_SIZE*sizeof(do
5、uble);s->top=s->base;s->stacksize=STACK_INIT_SIZE;char GetTop(SqStack *s) /返回线顶元素if(s->top=s->base)printf("栈为空!");return;return *(s->top-1);double GetTopDouble(DoubleStack *s)if(s->top=s->base)printf("栈为空!");return 0;return *(s->top-1);void Push(SqStack
6、 *s,int e)/操作符的入栈的函数if(s->top-s->base>=s->stacksize)s->base=(int *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(int);s->top=s->base+s->stacksize;s->stacksize+=STACKINCREMENT;*(s->top)=e;s->top+;void PushDouble(DoubleStack *s,double e)/操作数的入栈的函数if(s->
7、top-s->base>=s->stacksize)s->base=(double *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(double);s->top=s->base+s->stacksize;s->stacksize+=STACKINCREMENT;*(s->top)=e;s->top+;void Pop(SqStack *s,int *e)/操作符的出栈的函数if(s->top=s->base)printf("栈为空!&quo
8、t;);return;s->top-;*e=*(s->top);void PopDouble(DoubleStack *s,double *e)/操作数的出栈的函数if(s->top=s->base)printf("栈为空!");return;s->top-;*e=*(s->top);int In(char c)/判断是否是运算符,如果是反回1,不是则返回0;int i;for(i=0;i<8;i+)if(c=opi)return 1;return 0;char Precede(char charGetTop,char c)/判断运
9、算符的优先级switch (charGetTop)case '+':switch (c)case '+':return '>'case '-':return '>'case '*':return '<'case '/':return '<'case '(':return '<'case ')':return '>'case 'n':ret
10、urn '>'break;case '-':switch (c)case '+':return '>'case '-':return '>'case '*':return '<'case '/':return '<'case '(':return '<'case ')':return '>'case 'n':retu
11、rn '>'break;case '*':switch (c)case '+':return '>'case '-':return '>'case '*':return '>'case '/':return '>'case '(':return '<'case ')':return '>'case 'n':retur
12、n '>'break;case '/':switch (c)case '+':return '>'case '-':return '>'case '*':return '>'case '/':return '>'case '(':return '<'case ')':return '>'case 'n':return
13、 '>'break;case '(':switch (c)case '+':return '<'case '-':return '<'case '*':return '<'case '/':return '<'case '(':return '<'case ')':return '='break;case ')':swit
14、ch (c)case '+':return '>'case '-':return '>'case '*':return '>'case '/':return '>'case ')':return '>'case 'n':return '>'break;case 'n':switch (c)case '+':return '<
15、'case '-':return '<'case '*':return '<'case '/':return '<'case '(':return '<'case 'n':return '='break;double Operate(double a,char theta,double b)switch(theta)case '+':return (a+b);case '-'
16、;:return (a-b);case '*':return (a*b);case '/':return (a/b);void main()SqStack optr,temp;DoubleStack opnd;char c;char x,theta;int n,y=0,i;double m=0,a,b;InitStack(&optr);Push(&optr,'n');/初始化运算符栈InitDoubleStack(&opnd);InitStack(&temp);c=getchar();while(GetTop(&a
17、mp;optr)!='n'|c!='n')if(!In(c)Push(&temp,(c-'0');c=getchar();elseif(temp.top!=temp.base)y=0;m=0;while(temp.top!=temp.base)Pop(&temp,&n);for(i=0;i<y;i+)n=n*10;m+=n;y+;PushDouble(&opnd,m);switch(Precede(GetTop(&optr),c)case '<':Push(&optr,c
18、);c=getchar();break;case '=':Pop(&optr,&x);c=getchar();break;case '>':Pop(&optr,&theta);PopDouble(&opnd,&b);PopDouble(&opnd,&a);PushDouble(&opnd,Operate(a,theta,b);break;printf("%fn",GetTopDouble(&opnd);getchar();五、 实验结果:随便输入一个表达式然后得到运行结果如下六、 实验收获:本实验以C语言的栈的相关知识为基础,通过控制两个栈(运算数栈和运算符栈)的进出的栈操作,来实现对包含加、减、乘、除、括号运算符任意整型表达式的求解运算。从程序的编写来看,感觉这次我们真的学到了好多,特别是对程序的开发流程。从最初的选定程序,到最终的程序运行成功,让我们感到如果是仅仅掌握课本上的知识是远远不能够很好的应用到实际的编程中去的。在这个过程中还
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 双抗联合铁死亡调节的肿瘤治疗新策略
- 2026年一级注册建筑师之建筑结构考试题库300道附完整答案(各地真题)
- 2026年二级建造师之二建水利水电实务考试题库300道附答案【突破训练】
- 2025河北唐山市路南区选调教育、卫健系统专业技术人员82人备考题库附答案
- 2025江西赣州兴国县东兴国民村镇银行夏季招聘备考题库附答案
- 2025江西赣州宁福殡仪服务有限公司面向社会招聘4人模拟试卷附答案
- 2026年企业人力资源管理师之四级人力资源管理师考试题库300道附参考答案【模拟题】
- 2025浙江金华市浦江县国有企业劳务派遣员工招聘40人02笔试参考题库附答案
- 2026年初级经济师之初级经济师基础知识考试题库300道及参考答案(预热题)
- 2025浙江金华市东阳市部分机关事业单位招聘编外人74人员(二)备考题库附答案
- 2025年度物流行业市场调研:产业规模、政策支持及数字化趋势报告
- 国家开放大学2025年秋《思想道德与法治》终考大作业试卷2参考答案
- 河南省青桐鸣大联考2024-2025学年高二上学期12月月考试题生物含解析
- 2025安徽宣城宁国市面向社会招聘社区工作者25人笔试考试参考试题及答案解析
- 2026年出租汽车驾驶员(区域科目)自测试题及答案
- 球队战术讲解课件
- 2025年6月四级真题
- 2026年锦州师范高等专科学校单招职业适应性测试题库必考题
- 2025急性高甘油三酯血症胰腺炎康复期多学科管理共识解读
- 汽车清洁度检测方法
- 安全注射的课件
评论
0/150
提交评论