版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广东广州南沙区2027届六年级数学第一学期期末质量检测试题含解析
- 浙江省舟山市定嵊泗县2027届数学六上期末考试模拟试题含解析
- 丹寨县2026-2027学年三上数学期末联考模拟试题含解析
- 人教四年级数学下册图形的运动(二)《轴对称》示范公开课教案
- 贵州省毕节市赫章县2027届数学六上期末复习检测试题含解析
- 2027届河南省驻马店市蔡县三上数学期末复习检测试题含解析
- 广东省深圳市耀华实验学校2027届三上数学期末学业水平测试试题含解析
- 2027届广安市华莹市四年级数学第一学期期末达标检测试题含解析
- 黑龙江省大兴安岭地区2027届六上数学期末质量检测试题含解析
- 会宁县2027届数学六上期末考试试题含解析
- 马的繁育教学课件
- 四川省绵阳市东辰学校2025-2026学年高一上学期第一次月考数学试题(含解析)
- 2025内蒙古巴彦淖尔市磴口县第三批社区工作者招聘60人笔试考试备考试题及答案解析
- 索尼相机DSC-WX350中文使用说明书
- 砌筑班组安全培训内容课件
- 《中国金融学》课件 第14章 金融发展与金融“五篇大文章”-课件
- 妇产科学宫颈肿瘤课件
- GB 11122-2025柴油机油
- 注册会计师(综合阶段)真题与答案解析2025
- DB36∕T 2037-2024 地质灾害治理工程施工监理规范
- ut探伤培训课件
评论
0/150
提交评论