ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:19.45KB ,
资源ID:29625517      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/29625517.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(前中后缀表达式计算 无误c语言.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

前中后缀表达式计算 无误c语言.docx

1、前中后缀表达式计算 无误c语言 #include /*导入需要用到的各种包*/ #include #include typedef struct /*定义结构体用来存储操作符*/ char op; /*存储字符*/ int level; /*存储优先级*/ OpNode; typedef struct OpNode op100; int top; int size; /*表示栈内元素的个数*/ stack; /*定义符号栈*/ void init(stack *st) /*初始化栈*/ st-size=0; st-top=0; OpNode pop(stack *a) if (a-size=0

2、) /*如果栈为空结束操作*/ exit(-1); a-size-; return a-op-(a-top); /*取出栈顶元素*/ void push(stack *a,OpNode op) /*入栈函数*/ a-size+; a-op(a-top)+=op; OpNode top(stack *a) /*观察栈顶函数*/ if (a-size=0) /*如果栈为空结束操作*/ printf(stack is emptyn); exit(-1); return a-op(a-top)-1; /*只得到栈顶的值而不出栈*/ typedef struct /*定义数值栈*/ double num

3、100; int top; /*栈顶指针*/ int size; numstack; void init2(numstack *st) /*初始化数值栈*/ st-size=0; st-top=0; double pop2(numstack *a) /*数值栈出栈*/ if (a-size=0) /*出栈前的判空*/ exit(-1); a-size-; return a-num-(a-top); /*得到栈顶的值*/ void push2(numstack *a,double num) /*入栈*/ a-size+; a-num(a-top)+=num; int main(void) /*主

4、函数*/ void change (char str,char exp); /*声明要用到的各个函数*/ double CalResult(char exp); /*声明后缀表达式的计算函数*/ double Directcalresult(char str); int check(char str,char chestr100); char str100,exp100,chestr100; /*str存储原算术表达式,exp存储对应的 printf(算术表达式为:n); 后缀表达式,chestr存储容错字符*/ gets(str); if(check(str,chestr) /*调用容错函数

5、*/ printf(表达式错在:n); printf(%sn,str); printf(chestr); /*根据输入情况指出错误的地方*/ exit(-1); change(str,exp); /*调用函数将中缀转化为后缀*/ printf(后缀表达式为:%sn,exp); printf(运算结果为: %fn,CalResult(exp); /*调用函数计算后缀表达式*/ printf(直接运算的结果为: %fn,Directcalresult(str); /*调用直接计算函数*/ void change (char str,char ch) /*将前缀表达式转化为后缀表达式*/ int i

6、=0; /*str的索引*/ int k=0; char c; /*字符串中取出的放在C中*/ stack st; /*定义符号栈*/ OpNode op; OpNode ops; init(&st); /*初始化符号栈*/ c=stri+; while (c!=0) /*对字符串进行扫描*/ if ( (c=0&c=0&c0) /*再次检查栈是否为空,*/ op=top(&st); else break; /*为空就结束*/ pop(&st); /*去掉左括号*/ if (c=+|c=-) /*如果是+-号*/ op.op=c; op.level=1; /*优先级为1*/ if (st.si

7、ze=0) push(&st,op); /*如果此时栈为空直接入栈*/ else ops=top(&st); /*观察栈顶*/ while (ops.level=op.level) /*如果栈顶优先级高*/ ops=pop(&st); chk+=ops.op; /*将栈顶元素取出存入数组中*/ if (st.size0) ops=top(&st); /*进行判空操作,栈为空结束*/ else break; push(&st,op); /*此时栈顶优先级低,入栈*/ if(c=*|c=/|c=%) op.op=c; op.level=2; /*优先级为1*/ if (st.size=0) pus

8、h(&st,op); /*如果此时栈为空直接入栈*/ else ops=top(&st); /*观察栈顶*/ while (ops.level=op.level) /*如果栈顶优先级高*/ ops=pop(&st); /*将栈顶元素取出存入数组中*/ chk+=ops.op; if (st.size0) ops=top(&st); /*进行判空操作,栈为空结束*/ else break; push(&st,op); /*此时栈顶优先级低,入栈*/ c=stri+; /*索引自加检索下一个字符*/ while(st.size!=0) /*最后判断栈如果不为空*/ ops=pop(&st); /*

9、取出栈内元素存入数组中*/ chk+=ops.op; chk=0; /*将0作为结尾存入数组*/ double CalResult(char exp) /*后缀表达式的计算*/ char c; numstack numst; /*建立数值栈*/ double d1,d2,dr; int k=0; /*后缀表达式的索引*/ int i=0; /*将字符转化为浮点数的索引*/ char *s; char trans100; /*存字符表示的一段数字*/ init2 (&numst); /*实现数值栈*/ c=expk+; while (c!=0) /*开始扫描后缀表达式*/ if(c=+|c=-|

10、c=*|c=/|c=%) /*如果是操作符*/ switch(c) case + : /*如果是加法操作*/ d2=pop2(&numst); d1=pop2(&numst); dr=d1+d2; /*相加后入栈*/ push2(&numst,dr); break; case - : /*如果是减法操作*/ d2=pop2(&numst); d1=pop2(&numst); dr=d1-d2; /*相减后入栈*/ push2(&numst,dr); break; case * : /*如果是乘法操作*/ d2=pop2(&numst); d1=pop2(&numst); dr=d1*d2; /

11、*相乘后入栈*/ push2(&numst,dr); break; case / : /*如果是除法操作*/ d2=pop2(&numst); d1=pop2(&numst); dr=d1/d2; /*相除后入栈*/ push2(&numst,dr); break; case % : /*如果是取余操作*/ d2=pop2(&numst); d1=pop2(&numst); dr=(double)(int)d1%(int)d2); /*类型转化并取余后入栈*/ push2(&numst,dr); break; if (c=0&c=0&c=9|c=.) transi+=c; /*将字符存入数组进

12、行下一个的扫描*/ c=expk+; transi+=0; /*将表示数字的字符串结束*/ i=0; s=trans; /*将指针指向该数组*/ d1=atof(s); /*利用函数将字符串转化为浮点数*/ push2(&numst,d1); c=expk+; return pop2(&numst); /*最后结果将在数值栈中,取出作为返回值*/ double Directcalresult(char str) /*表达式的直接计算出结果*/ stack ms; /*建立符号栈*/ numstack mns; /*建立数值栈*/ double calculate(double od1,doub

13、le od2,OpNode op); int index=0; /*str的索引*/ int len=strlen(str); char c; char trans100; /*存放数值的一段字符*/ int i=0; /*trans的索引*/ char * s; double d; OpNode tempn; /*存放当前扫描的操作符*/ OpNode templn; double oda,odb,odr; double result; /*作为返回值返回结果*/ init (&ms); /*实现两个栈*/ init2(&mns); while(index=0&c=0&c=tempn.lev

14、el) /*栈顶优先级高*/ templn=pop(&ms); /*取出操作数和操作符计算*/ odb=pop2(&mns); oda=pop2(&mns); odr=calculate(oda,odb,templn); push2(&mns,odr); /*结算结果入栈*/ if(ms.size0) templn=top(&ms); /*如果栈空结束*/ else break; push(&ms,tempn); /*操作符入栈*/ if(c=*|c=/|c=%) tempn.level=2; /*定义优先级为2*/ tempn.op=c; if(ms.size=0) push(&ms,tem

15、pn); /*栈空直接入栈*/ else templn=top(&ms); while (templn.level=tempn.level) /*栈顶优先级高*/ templn=pop(&ms); /*取出操作数和操作符计算*/ odb=pop2(&mns); oda=pop2(&mns); odr=calculate(oda,odb,templn); push2(&mns,odr); /*结算结果入栈*/ if(ms.size0) templn=top(&ms); else break; /*如果栈空结束*/ templn=top(&ms); push(&ms,tempn); /*操作符入栈

16、*/ if(c=() /*如果是左括号*/ tempn.level=-1; tempn.op=c; /*直接入栈优先级定位-1*/ push(&ms,tempn); if(c=) /*如果是右括号*/ while(tempn.op!=() /*遇到左括号结束*/ templn=pop(&ms); odb=pop2(&mns); /*从数栈中取两个数,从符号栈里取操作符*/ oda=pop2(&mns); odr=calculate(oda,odb,templn); /*计算出结果入栈*/ push2(&mns,odr); if (ms.size0) tempn=top(&ms); else b

17、reak; /*如果栈空结束*/ pop(&ms); /*取出左括号*/ tempn=top(&ms); while(1) templn=pop(&ms); odb=pop2(&mns); /*从数栈中取两个数,从符号栈里取操作符*/ oda=pop2(&mns); odr=calculate(oda,odb,templn); /*计算出结果入栈*/ push2(&mns,odr); if (ms.size0) tempn=top(&ms); /*如果栈空结束*/ else break; result =pop2(&mns); /*最后的结果在数值栈中返回*/ return result; d

18、ouble calculate(double od1,double od2,OpNode op) /*已知操作符和操作数的计算*/ switch(op.op) case + : return od1+od2; case - : return od1-od2; /*判断操作符是哪个执行相应计算*/ case * : return od1*od2; case / : return od1/od2; case % : return (double)(int)od1%(int)od2); return 0; /*如果上面的都没有执行返回0*/ int check(char str,char chest

19、r100) /*容错函数*/ char c; char cdivide; int i=0; /*str的索引*/ stack che; /*括号匹配用到的栈*/ OpNode temp; int k=0; /*chestr的索引*/ int isinteger(char integer100); /*%计算是判断是否是整数*/ char s110; /*%操作时存储%左右的数字*/ char s210; int indexs1=0; /*s1s2的索引*/ int indexs2=0; init (&che); int flag=0; /*0没有出错1有错*/ int tag=0; c=str

20、i; /*开始扫描*/ int j; /*数组chestr索引*/ for(j=0;j0) pop(&che); /*栈不为空就取出一个左括号*/ else flag=1; printf(缺少左括号n); /*否则提示有错*/ chestri=; /*右括号下加*/ if(c=/) /*判断除数是否为0*/ j=0; cdivide=stri+1+j; /*取出除号后的数*/ while(cdivide=0&cdivide=0&stri-indexs1-1=0&stri+indexs2+1=9 /*以%为中心向后扫描*/ |stri+indexs2+1=.) /*如果是数或小数点*/ s2indexs2+=stri+indexs2+1; /*放在s1中*/ if(isinteger(s1) /*调用函数判断s1内存到是否是整数*/ printf(取余算法第一个数应为整数运算n); flag=1; /*记录为有错*/ chestri-indexs1=; if(isinte

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1