数学表达式计算(c语言实现).doc

数学表达式计算(c语言实现).doc

ID:50668912

大小:340.55 KB

页数:13页

时间:2020-03-13

数学表达式计算(c语言实现).doc_第1页
数学表达式计算(c语言实现).doc_第2页
数学表达式计算(c语言实现).doc_第3页
数学表达式计算(c语言实现).doc_第4页
数学表达式计算(c语言实现).doc_第5页
资源描述:

《数学表达式计算(c语言实现).doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、用两种方式实现表达式自动计算一、设计思想计算算术表达式可以用两种方法实现:1.中缀转后缀算法此算法分两步实现:先将算术表达式转换为后缀表达式,然后对后缀表达式进行计算。具体实现方法如下:(1)中缀转后缀需要建一个操作符栈op和一个字符数组exp,op栈存放操作符,字符数组用来存放转换以后的后缀表达式。首先,得到用户输入的中缀表达式,将其存入str数组中。对str数组逐个扫描,如果是数字或小数点,则直接存入exp数组中,当扫描完数值后,在后面加一个#作为分隔符。如果是操作符,并且栈为空直接入栈,如果栈不为空,与栈顶

2、操作符比较优先等级,若比栈顶优先级高,入栈;如果比栈顶优先级低或相等,出栈将其操作符存到exp数组中,直到栈顶元素优先等级低于扫描的操作符,则此操作符入栈;如果是左括号,直接入栈,如果是右括号,出栈存入exp数组,直到遇到左括号,左括号丢掉。然后继续扫描下一个字符,直到遇到str中的结束符号,扫描结束。结束后看op栈是否为空,若不为空,继续出栈存入exp数组中,直到栈为空。到此在exp数组最后加结束字符。我们就得到了后缀表达式。(2)后缀表达式计算此时需要一个数值栈od来存放数值。对exp数组进行逐个扫描

3、,当遇到数字或小数点时,截取数值子串将其转换成double类型的小数,存入od栈中。当遇到操作符,从栈中取出两个数,进行计算后再放入栈中。继续扫描,知道扫描结束,此时值栈中的数值就是计算的结果,取出返回计算结果。2.两个栈实现算法此算法需要两个栈,一个值栈od,一个操作符栈op。将用户输入的数学表达式存入str数组中,对其数组进行逐个扫描。当遇到数字或小数点,截取数值子串,将其转换成double类型的数值存入od栈中;当遇到左括号,直接入op栈;遇到右括号,op栈出栈,再从值栈od中取出两个数值,计算将其结果存入

4、值栈中,一直进行此操作,直到操作符栈栈顶为左括号,将左括号丢掉。如果遇到操作符,若op栈为空,直接入栈;若栈不为空,与栈顶元素比较优先等级,若比栈顶操作符优先等级高,直接入op栈,如果低于或等于栈顶优先等级,op栈出栈,再从值栈中取出两个数值,计算将其结果存入值栈中,一直进行此操作,直到栈顶优先等级低于扫描的操作符等级,将此操作符入op栈。继续扫描直到遇到str中的结束字符,扫描结束。此时看操作符栈是否为空,若不为空,出栈,再从值栈中取出两个数值进行计算,将其结果存入值栈,一直进行此操作,直到操作符栈为空。此

5、时把值栈中的数值取出,即为所得的最终计算结果。二、算法流程图第一种算法:中缀转后缀算法-13-用两种方式实现表达式自动计算其主函数流程图为:图1主函数算法流程图中缀转后缀算法流程图如下:图2中缀转后缀算法流程图-13-用两种方式实现表达式自动计算计算后缀表达式流程图如下:图3后缀表达式计算流程图第二种算法:两个栈算法其主函数流程图为:图4主函数算法流程图-13-用两种方式实现表达式自动计算直接计算数学表达式流程图如下:图5直接计算表达式流程图三、源代码下面给出的是用中缀转后缀算法实现的程序的源代码:#includ

6、e#include#include#include#defineMAXSIZE100//定义宏,数组最大长度为100-13-用两种方式实现表达式自动计算//函数实现中缀转后缀,将存储数学表达式的数组str传参进来,exp存储后缀表达式voidtrans(charstr[],charexp[]){struct{chardata[MAXSIZE];//用来存放操作符inttop;//数组下标}op;//用结构体创建操作符栈charch;inti

7、=0,j=0,tempi=0;op.top=-1;//给操作符栈初始化,令下标为-1while(ch!=''){ch=str[i];//取str数组的第i个元素赋值给chif((ch>='0'&&ch<='9')

8、

9、ch=='.')//对数值操作{tempi=i;//若ch为数字或小数点,将其下标值赋给临时下标tempi//依次向后扫描str数组,若一直为数字,跳入while循环while((ch>='0'&&ch<='9')

10、

11、ch=='.'){tempi++;exp[j]=ch;//将数字存入exp数组中

12、j++;ch=str[tempi];//取str数组中下标为tempi的元素赋给ch}exp[j]='#';j++;//用#做分隔符,将数值分隔开i=tempi;//跳出循环,将此时的tempi赋给i,继续向后扫描}//对操作符操作elseif(ch=='+'

13、

14、ch=='-'

15、

16、ch=='*'

17、

18、ch=='/'

19、

20、ch=='%'

21、

22、ch=='('

23、

24、ch==')'){i

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。