




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中东地区化工仓储租赁与安全管理合同
- 物流园区工程总承包及道路照明系统协议
- 仓储自动化叉车调度员派遣服务合同范本
- 航天器电池系统运行监控补充协议
- 插画绘本画蛇添足绘本故事成语故事
- 软件代理销售培训课件
- 《肺癌患者的护理课件》
- 《病房护理质量核查》课件
- 餐饮服务卫生与安全
- 动物的生长与繁殖课件
- 第18讲化学键(讲义)(原卷版+解析)
- 浆砌片石挡墙施工方案
- (高清版)TDT 1056-2019 县级国土资源调查生产成本定额
- 国家开放大学《Python语言基础》实验5:循环结构基本应用参考答案
- 农耕文节策划方案
- 高流量氧疗的应用与护理
- 船舶制造业行业痛点与解决措施
- 危险性较大的专项施工方案审批表
- 2023年江苏南京林业大学招聘专职辅导员15人(第二批)笔试参考题库(共500题)答案详解版
- 全国优质课一等奖教师信息化教学设计和说课大赛高中中职数学《计数原理》课件
- (23)-9.3《艺术学概论》第九章第三节 艺术批评的维度与方法
评论
0/150
提交评论