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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

C语言实现表达式计算Word文档格式.docx

1、如果栈内元素的优先级大于等于当前元素的,则依次出栈元素进行计算。每次计算要在数栈出栈两个整合后的数,先出栈的数字放在运算符后面,后出栈的数字放在运算符的前面,将运算以后的结果再次存入数栈。如果遇到左括号则无条件进栈,并只在有右括号出现的时候才有可能出栈。如果遇到右括号,则无条件让栈内元素出栈进行计算,直到左括号出栈为止。如此计算将表达式所有元素全部索引。之后再对栈内剩余元素进行操作。为了方便计算,计算过程使用了函数体。主函数只负责输入中缀表达式和输出最后的运算结果。同时,建立了优先级函数使用了swich语句为每个运算符赋值优先级,方便在计算过程中直接调用。也建立了运算函数对每个运算符做特定的运

2、算,也是使用了swich语句。另外,最后为了能够识别一些错误,在运算过程中加入了错误的判定,比如出栈时栈空或者左右符号不符等。在编写过程中发现数栈的看栈顶没有使用过,所以删除了数栈的看栈顶。二、算法流程图中缀转后缀再计算的算法分两个流程,第一步是中缀表达式转换成后缀表达式;图1 中缀转后缀算法流程图第二步是将后缀表达式进行计算输出。图2 后缀计算算法流程图边转换边计算的算法只一个流程即可。图3 边转换边计算算法流程图三、源代码下面给出的是用中缀转后缀再计算的算法实现的程序的源代码:#includestdlib.h#define N 100 /*N为数栈和表达式数组容量*/#define M 5

3、0 /*M为符栈和其他数组容量*/typedef struct /*定义运算符类型,level为运算符等级*/ char Type; int level;Type;typedef struct /*定义数栈*/ double stackN; int top;OdStack;typedef struct /*定义符栈*/ Type stackM;OpStack;void Init_OdStack(OdStack *s) /*定义初始化数栈*/ (*s).top=0; void OdPush(OdStack *s,double n) /*进数栈*/ if(*s).top=N-1) /*如果栈满则报

4、错退出程序*/ Error(); (*s).stack(*s ).top=n; (*s).top+;double OdPop(OdStack *s) /*定义出数栈*/ if (*s).top=0) /*如果栈空则报错退出程序*/ else (*s).top-; return (*s).stack(*s).top;void Init_OpStack(OpStack *s) /*定义初始化符栈*/void OpPush(OpStack *s,Type *sign) /*定义进符栈*/ if(*s).top=M-1) /*如果栈满则报错退出程序*/ (*s).stack(*s).top=*sign

5、;Type OpPop(OpStack *s) /*定义出符栈*/ if (*s).top=0) /*栈空则报错退出程序*/Type OpPeek(OpStack *s) /*定义看符栈顶*/ Type ren; if (*s).top=0) /*判栈空,空则赋等级0值*/ ren.level=0; return ren; return (*s).stack(*s).top-1;int Error() /*报错函数*/ printf(Error!); getch(); exit(1);int Com(char tempch) /*定义运算符等级*/ /*给不同运算符定级*/ switch (t

6、empch) case +:-level=1;break;*/%level=2; return level;double Oper(double a,double b,char tempch) /*定义运算过程*/ double ren; switch (tempch) /*对不同运算符执行运算并返回结果*/ren=b+a;ren=b-a;ren=b*a;ren=b/a;ren=(int)b%(int)a; /*取模运算将数取整*/double Calu(char *exp1) OdStack OdStack; /*定义数栈*/ OpStack OpStack; /*定义符栈*/ Type t

7、empsign; /*定义Type型运算符*/ char exp2N,tempexpM,tempch; /*定义后缀表达式数组exp2,整合数组tempexp,tempch为运算符*/ int index1,index2,tempindex; /*index1为主要索引,index2为次要索引,tempindex为附加索引*/ double number,a,b,c; /*number为整合数,a、b、c为运算数*/ Init_OdStack(&OdStack); /*初始化数栈*/ Init_OpStack(&OpStack); /*初始化符栈*/ index1=0; /*初始化索引,附加索

8、引*/ index2=0; tempindex=0; tempexp0=0; /*初始化整合数组*/ while(exp1index1!=) /*处理初始表达式转化成后缀表达式*/ if(exp1index10& exp1index1) | exp1index1=. ) exp2index2=exp1index1; /*连续的数字元素不分开并依次存入后缀表达式*/ index2+; index1+; exp2index2= /*结束后用空格将其与后面的元素分开*/ if(exp1index1=|exp1index1=) /*处理运算符元素*/ tempsign.Type=exp1index1;

9、 tempsign.level=Com(tempsign.Type); /*求运算符等级*/ while(OpPeek(&OpStack).level=tempsign.level) /*当栈中符的等级大于当前等级时则取出符存入后缀表达式*/ exp2index2=OpPop(&OpStack).Type; /*每两个运算符之间用空格分开*/ OpPush(&OpStack,&tempsign); /*结束后将当前运算符入栈*/ if(exp1index1=() /*如果是左括号则无条件进栈*/ tempsign.level=-1; /*进栈后等级为-1,以便遇到右括号出栈*/) /*右括号规

10、则*/OpStack).level != -1) /*遇到右括号则不断出栈存入后缀表达式直到寻到左括号*/ OpPop(& /*直到遇到左括号将左括号出栈*/ else /*如果输入了非法字符则报错退出程序*/=0) /*原表达式结束后对栈进行操作直到栈空*/ if(OpPeek(&OpStack).level=-1) /*如果有为用掉的左括号则报错退出程序*/ ; /*最后结束后缀表达式*/nThe Post Expression is : n %s,exp2); /* 得到后缀表达式 */ /*索引归零,开始计算结果*/ while(exp2index1 != ) /*循环直到后缀表达式结

11、束*/ if(exp2index1 exp2index1) | exp2index1= ) /*用附加索引判断数的长度并整合入整合数组*/ tempexptempindex=exp2index1; tempindex+; tempexptempindex= /*结束整合数组*/ if( tempexp0 !) /*如果整合数组有值则转换成浮点型存入数栈*/ number = atof(tempexp); OdPush(&OdStack ,number); /*入栈后初始化整合数组和附加索引以便下次整合*/ if(exp2index1=) /*判断空格,有则跳过*/ while(exp2inde

12、x1=)if(exp2index1=|exp2index1=) /*对加减乘除和取模进行运算*/ a=OdPop(& b=OdPop(& tempch=exp2index1; c=Oper(a,b,tempch);OdStack,c); /*将计算结果放入数栈*/ return OdPop(&OdStack) ; /*弹出结果*/main() char strN; /*定义数组以存储表达式*/ double result; /*定义result以存储结果*/Please Enter the Expression:n scanf(%s,str); result=Calu(str); /*计算表达

13、式并返回结果值*/nThe result is : n %f,result);下面给出的是用边转换边运算的算法实现的程序的源代码:void Init_OdStack(OdStack *s) /*定义初始化数栈*/ double Oper(double a,double b,char tempch) /*定义运算过程*/double Calu(char *exp) /*定义计算过程,依次读入字符*/ char tempexpM,tempch; /*定义整合数组tempexp,tempch为运算符*/ int index,tempindex; /*index为索引,tempindex为附加索引*/ index=0; while(expindex!) /*执行操作直到表达式结束*/ if(expindex expindex)|expindex= tempexptempindex=expindex; index+; if(tempexp0!) /*如果整合数组有值则转换成浮点型存入数栈*/ number=atof(tempexp); if(expindex=|expindex= tempsign.Type=expindex;/*当栈中符的等级大于当前等级时则取出符进行运算*/ tempch=OpPop(& b=OdPop(

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2