版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、if(notationi=if(notationi=,.¬ationi+l!=,0,¬ationi+2!=,0,¬ationi+3!=,0,¬atiintjudge(charnotation)intjudge(charnotation)C语言课程设计之逆波兰表达式逆波兰表达式(后缀表达式)reversepolishnotation程序实现的功能是将中缀表达式转变为后缀表达式,再求出其值主要运用的知识点有:isdigit函数,pow函数,systemCcls)函数,堆栈,格式的强制转换includeincludeincludeincludevoidshift(charno
2、tation);中缀表达式转换为后缀表达式的转换函数floatcalculate(floata2Jntk);intjudge(charnotation);intgrade(chara);voiddisplay(floata2,intk);主函数voidmain()计算后缀表达式判断输入的中缀表达式是否符合要求返回运算符的等级在屏幕上显示后缀表达式charnotation100;charchoice;doprintf(H请输入正确的中缀表达式:n“);printf(H例如:2*3+4/3-(2+l)nu);scanf(”s蔦¬ation);if(judge(notation)shift(n
3、otation);elseprintf(M你的表达式有错误,请仔细检査!nH);fflush(stdin);printf(n你是否需要继续计算(是输入Y/y,否输入其他任意键)n“);scanf(,%c,/&choice);getchar();systemCcls11);while(choice=,Yl|choice=y);printf(n程序结束,谢谢使用!n”);判定函数inti/m/num=l,pl=0/p2=0;for(i=0;notationi!=0;i+)排除表达式外的字符if(notationi!=(¬ationi!=,),¬ationi!=,+,¬ationi
4、!=¬ationi!=*,¬ationi!=7,&!isdigit(notationi)¬ationi!=T)num二0;returnnum;if(notation0=*|notation0=7|notation0=)|notation0=.)排除第一个字符为/,),num=0;returnnum;for(i=0;notationi!=,0,;i+)排除77?之间的连续出现以及/;:后面直接加丁if(notationi!=(,¬ationi!=),&!isdigit(notationi)if(notationi+l!=(&!isdigit(notationi+l)num
5、=0;returnnum;if(notationi=,(&(notationi+l=丁11notationi+l=,.|notationi+l=,*,|notationi+1=7*)排除C秋)7起连用num二0;returnnum;if(notationi=丁&(notationi+l=,(,11notation(i+l=,.)/排除)和(*,T一起连用num=0;returnnum;for(i=0;notationi!=,0,;i+)小数位不得超过4位if(isdigit(notationi)if(isdigit(notationi)oni+4!=,0¬ationi+5!=,0,)if
6、(isdigit(notationi+l)&isdigit(notationi+2)&isdigit(notationi+3)&isdigit(notationi+4)&isdigit(notationi+5)num=O;returnnum;for(i=0;notationi!=0;i+)排除一个小数中有两个小数点的情况if(notationi=.)i+;while(isdigit(notationi)i+;if(notationi=.)num=0;return0;for(i=0;notationi!=,0,;i+)排除丁后面不可以直接跟数字以及前面不可以加数字if(notationi=)&i
7、sdigit(notationi+l)num=0;returnnum;if(isdigit(notationi)¬ationi+l=,(,)num=0;returnnum;for(i=0;notationi!=0;i+)约束数字的位数一共最多为七位m=0;用来计数,数字的位数为7while(isdigit(notationi)11notationi=,.1)m+;if(notationi=.)m-;if(m7)num=O;returnnum;for(i=0;notationi!=,0,;i+)if(notationi=,(,)pl+;if(notationi=丁)p2+;if(pl!=p
8、2)num二0;returnnum;returnnum;转换函数voidshift(charnotation)charsl100;sl0=,#1;floats21002;数以及是否是运算符f与丁需要配对存在第一维放后缀表达式的元素,第二维表示小数点的位/numlf与丁需要配对存在第一维放后缀表达式的元素,第二维表示小数点的位/numl为存储整数位num2为存储小数位num2=float(num2+(-l)*pow(0.1num2=float(num2+(-l)*pow(0.1/+t)*(notationi-0,);if(isdigit(notationi)if(isdigit(notation
9、i)if(i=0¬ationi=+)第一位为正号的情况if(isdigit(notation+i)numl=O;整数部分while(isdigit(notationi)numl=numl*10+(notationi-0);/notationi-0可以将字符转换为整数09i+;num2=0;小数部分t=0;if(notationi=.)i+;while(isdigit(notationi)num2=float(num2+pow(0.1,+t)*(notationi-0,);i+;s2k+0=float(numl+num2);s2k-ll=float(t);if(i=0¬ationi=
10、-)第一位为负号的情况,代码与正号类似if(isdigit(notation+i)numl=O;while(isdigit(notationi)numl=(-l)*numl*10+(-l)*(notationi-,0,);i+;num2=0;t=0;if(notationi=.)i+;while(isdigit(notationi)slj+=notationi+;slj+=notationi+;if(isdigit(notationi)if(isdigit(notationi)i+;s2k+0=float(numl+num2);s2k-ll=float(t);if(isdigit(notati
11、oni)当前字符为数字的情况与为正号的情况一样numl=O;while(isdigit(notation)numl=numl*10+(notation卜O);i+;num2=0;t=0;if(notationi=1.)i+;while(isdigit(notationi)num2=float(num2+pow(0.1/+t)*(notationi-0,);i+;s2k+0=float(numl+num2);s2k-ll=float(t);if(notationi=+11notationi=-11notationi=*11notationi=/)当前的字符为操作符时,如杲si的站定为f则将字符直
12、接送入siif(siU-i=T)slO+=notationi+;if(notationi=l+,|notationi=IJ|notationi=,*11notationi=7)当前字符为操作符时的普通的情况if(grade(notationi)grade(slj-l)elseif(isdigit(notationi)if(isdigit(notationi)s2k+0=slHl;s2k-ll=-l;slj+=notationi+;if(notationi=,(,)当前字符为(的情况slj+=notationi+;if(notationi=V)/(后跟正号的情况if(isdigit(notati
13、on+i)numl=0;while(isdigit(notationi)numl=numl*10+(notationi-,0,);i+;num2=0;t=0;if(notationi=,.)i+;while(isdigit(notationi)num2=float(num2+pow(0.1,+t)*(notationi-,0);i+;s2k+0=float(numl+num2);s2k-ll=float(t);if(notationi)f后跟负号的情况if(isdigit(notation+i)numl=0;while(isdigit(notationi)numl=float(-l)*numl
14、*10+(-l)*(notationi-,0,);i+;if(isdigit(notationi)if(isdigit(notationi)num2=0;t=0;if(notationi=,.1)i+;while(isdigit(notationi)num2=float(num2+(-l)*pow(0.1,+t)*(notationi-,0,);i+;s2k+0=float(numl+num2);s2k-ll=float(t);if(notationi=y)/当前字符为丁的情况while(slj!=f)s2k+O=slj;s2k-ll=-l;i+;while(jO&sl-j!=#)依次将si中
15、的除T#外的所有操作符出栈,相当于最后的扫尾工作s2k+O=slj;s2k-ll=-l;printf(”n后缀表达式(逆波兰表达式):n”);display(s2,k-l);printf(n表达式的值为:n”);sum=calculate(s2,k-l);printf(%7.4f,sum);计算函数floatcalculateffloata2zintk)inti,t=OJ=k;floatb1002,c100;if(isdigit(notationi)if(isdigit(notationi)for(i=k;i=0;i-)biO=ak-iO;bil=ak-il;i=k;while(j=0)if(
16、bil!=-l)ct=float(biO);Hi-;t+;if(bil=-l)每当遇到一个运算符则将栈最上面的两个数出栈进行运算,然后再入栈if(int(biO)“+Jct-2=float(ct-2+ct-lJ);if(int(biO)“)ct-2=float(ct-2-ct-l);if(int(biO)=1*1)ct-2=float(ct-2*ct-l);if(int(biO)=y)ct-2=float(ct-2/ct-l);returnc0;运算到最后,栈中的元素即为结果等级函数intgrade(chara)按照运算符的优先级if(a=,#1)return0;if(a*()return1;
17、if(a=,-,|13=+)return2;if(a=,*,|a=7,)return3;if(a“)return4;elsereturn5;显示函数voiddisplay(floata2Jntk)inti;for(i=0;i(ab+c*)(ab+e/)-Tab+c*ab+e/-将一个普通的中序表达式转换为逆波兰表达式的一般算法是:首先需要分配2个栈,一个作为临时存储运算符的栈S1(含一个结束符号),一个作为输入逆波兰式的栈S2(空栈),S1栈可先放入优先级最低的运算符#,注意,中缀式应以此最低优先级的运算符结束。可指定其他字符,不一定非#不可。从中缀式的左端开始取字符,逐序进行如下步骤:若取出的字符是操作数,则分析出完整的运算数,该操作数直接送入S2栈;若取出的是运算符,并且当前S1栈顶为(,则当前运算符直接入S1栈。若取出的字符是运算符,则将该运算符与S1栈栈顶元素比较,如果该运算符优先
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年家居装修预付款合同模板版B版
- 2024年家庭解体后子女抚养与探视权合同版B版
- 2024年办公场所装修协议详细条款示例版
- 2024年企业并购重组保密协议
- 2024年子女抚养权重新分配合同
- 2024年度企业财务规划顾问服务协议一
- 2024年上海二手房销售协议模板版B版
- 2024年度仓库管理人员安全责任合同书版B版
- 2024年二人合作经营具体条款协议版
- 2024年家居供暖供气系统安装协议样本版B版
- 2023学年完整公开课版年数总和法
- 工程开工报告(5篇)
- 数字地形分析概述
- 清华大学出版社机械制图习题集参考答案(课堂PPT)
- ACS合并肾功能不全的抗血小板治疗
- 安徽绿沃循环能源科技有限公司12000t-a锂离子电池高值资源化回收利用项目(重新报批)环境影响报告书
- GB/T 4510-2017石油沥青脆点测定法弗拉斯法
- GB/T 19634-2021体外诊断检验系统自测用血糖监测系统通用技术条件
- PS基础学习教程
- GB 2716-2018食品安全国家标准植物油
- GA/T 950-2019防弹材料及产品V50试验方法
评论
0/150
提交评论