数学表达式计算(c语言实现).doc
《数学表达式计算(c语言实现).doc》由会员分享,可在线阅读,更多相关《数学表达式计算(c语言实现).doc(13页珍藏版)》请在咨信网上搜索。
1、用两种方式实现表达式自动计算一、 设计思想计算算术表达式可以用两种方法实现: 1.中缀转后缀算法 此算法分两步实现:先将算术表达式转换为后缀表达式,然后对后缀表达式进行计算。具体实现方法如下:(1) 中缀转后缀 需要建一个操作符栈op和一个字符数组exp,op栈存放操作符,字符数组用来存放转换以后的后缀表达式。首先,得到用户输入的中缀表达式,将其存入str数组中。对str数组逐个扫描,如果是数字或小数点,则直接存入exp数组中,当扫描完数值后,在后面加一个#作为分隔符。如果是操作符,并且栈为空直接入栈,如果栈不为空,与栈顶操作符比较优先等级,若比栈顶优先级高,入栈;如果比栈顶优先级低或相等,出
2、栈将其操作符存到exp数组中,直到栈顶元素优先等级低于扫描的操作符,则此操作符入栈;如果是左括号,直接入栈,如果是右括号,出栈存入exp数组,直到遇到左括号,左括号丢掉。然后继续扫描下一个字符,直到遇到str中的结束符号0,扫描结束。结束后看op栈是否为空,若不为空,继续出栈存入exp数组中,直到栈为空。到此在exp数组最后加结束字符0。我们就得到了后缀表达式。 (2) 后缀表达式计算此时需要一个数值栈od来存放数值。对exp数组进行逐个扫描,当遇到数字或小数点时,截取数值子串将其转换成double类型的小数,存入od栈中。当遇到操作符,从栈中取出两个数,进行计算后再放入栈中。继续扫描,知道扫
3、描结束,此时值栈中的数值就是计算的结果,取出返回计算结果。2.两个栈实现算法 此算法需要两个栈,一个值栈od,一个操作符栈op。将用户输入的数学表达式存入str数组中,对其数组进行逐个扫描。当遇到数字或小数点,截取数值子串,将其转换成double类型的数值存入od栈中;当遇到左括号,直接入op栈;遇到右括号,op栈出栈,再从值栈od中取出两个数值,计算将其结果存入值栈中,一直进行此操作,直到操作符栈栈顶为左括号,将左括号丢掉。如果遇到操作符,若op栈为空,直接入栈;若栈不为空,与栈顶元素比较优先等级,若比栈顶操作符优先等级高,直接入op栈,如果低于或等于栈顶优先等级,op栈出栈,再从值栈中取出
4、两个数值,计算将其结果存入值栈中,一直进行此操作,直到栈顶优先等级低于扫描的操作符等级,将此操作符入op栈。继续扫描直到遇到str中的结束字符0,扫描结束。此时看操作符栈是否为空,若不为空,出栈,再从值栈中取出两个数值进行计算,将其结果存入值栈,一直进行此操作,直到操作符栈为空。此时把值栈中的数值取出,即为所得的最终计算结果。二、算法流程图第一种算法:中缀转后缀算法其主函数流程图为:图1 主函数算法流程图中缀转后缀算法流程图如下:图2 中缀转后缀算法流程图计算后缀表达式流程图如下: 图3 后缀表达式计算流程图第二种算法:两个栈算法其主函数流程图为:图4 主函数算法流程图直接计算数学表达式流程图
5、如下:图5 直接计算表达式流程图三、源代码下面给出的是用中缀转后缀算法实现的程序的源代码:#include#include#include#include#define MAXSIZE 100 /定义宏,数组最大长度为100/函数实现中缀转后缀,将存储数学表达式的数组str传参进来,exp存储后缀表达式void trans(char str,char exp) struct char dataMAXSIZE;/用来存放操作符int top;/数组下标 op;/用结构体创建操作符栈 char ch; int i=0,j=0,tempi=0; op.top=-1;/给操作符栈初始化,令下标为-1
6、while(ch!=0) ch=stri; /取str数组的第i个元素赋值给ch if(ch=0& ch=0 & chlevel(op.dataop.top) op.top+; op.dataop.top=ch;/进栈操作 else /如果所扫描的操作符优先等级没有栈顶元素高, /一直出栈直到比栈顶元素优先级高 while(level(ch)=level(op.dataop.top) expj=op.dataop.top;/出栈存入exp数组中 op.top-; j+; if(op.top=-1)break;/如果栈为空,跳出循环 op.top+; op.dataop.top=ch;/比栈顶元
7、素优先级高,入栈 i+;/str下标加1,向后扫描 while(op.top!=-1)/扫描结束后如果操作符栈不为空,出栈直至为空 expj=op.dataop.top;/出栈存入exp数组中 op.top-; j+; expj=0;/赋0结束exp字符数组 int level(char op)/判断操作符优先等级if(op = + | op = -)/若为+、-,等级为1return 1; else if(op = * | op = / | op = %)return 2; /若为*、/、%,等级为2 else if(op = ()return -1 ; /若为(,等级为-1 elseret
8、urn -3; /其他等级为-3;double calvalue(double od1,double od2,char tempop)/计算switch(tempop)case +: return od1 + od2; /计算加法case -: return od1 - od2;/计算减法 case *: return od1 * od2;/计算乘法 case /: return od1 / od2;/计算除法case %: return fmod(od1,od2);/求余return 0;double calculate(char exp)/计算后缀表达式struct /用结构体创建值栈do
9、uble dataMAXSIZE; /存储数值int top;od; double d; /声明d变量存储数值double od1,od2; /存储值栈依次pop出来的操作数char ch;char tempch20; /声明临时数组存储子串int j=0,t;int length=strlen(exp);/计算exp数组的长度od.top=-1; /初始化值栈,令下标为-1while(j=0 & ch=9) |ch=.)tempcht=ch;t+;/依次存放到临时数组中j+;ch=expj;tempcht=0;/结束tempch数组d=atof(tempch);/将子串转化成double类型
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数学 表达式 计算 语言 实现
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【天****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【天****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。