




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 跨学科教师协作培训计划
- 2025至2030药用明胶行业发展研究与产业战略规划分析评估报告
- 2025至2030苦橙叶行业市场占有率及投资前景评估规划报告
- 2025至2030精油行业兼并重组机会研究及决策咨询报告
- 2025至2030空气源热泵市场市场占有率及投资前景评估规划报告
- 2024-2025年下学期小学英语提分计划
- 第一学期小学班级文化建设德育计划
- 数学教研组教学反馈机制完善计划
- 2025年秋季小学安全文化建设计划
- 城市施工现场传染病防控联合措施
- 水利勘测设计管理制度
- 2025年安全生产考试题库(造纸行业安全规范)试题
- DB31/T 1093-2018混凝土砌块(砖)用再生骨料技术要求
- 无人机培训公司运营管理方案
- 经理副职面试题及答案
- 大一计算机考试真题单选题100道及答案
- 信用卡消费者保护培训
- 青蓝工程工作总结师傅
- 石油化工生产与操作作业指导书
- 2025年中国汽车配件出口分析及各国进口政策影响白皮书-特易资讯
- 广场项目基坑监测工程技术投标书
评论
0/150
提交评论