用两种方式实现表达式自动计算
WPSOffice如何在电子中使用函数进行自动计算

WPSOffice如何在电子中使用函数进行自动计算WPS Office如何在电子表格中使用函数进行自动计算WPS Office已经成为了许多用户首选的办公软件之一,其中电子表格功能十分强大。
在电子表格中,我们需要进行大量的计算和分析工作,而WPS Office提供了丰富的函数来帮助我们自动计算数据。
本文将介绍如何利用WPS Office中的函数来进行自动计算。
一、函数的基本概念和使用方法在WPS Office的电子表格中,函数是一种可以对数据进行计算、分析和处理的工具。
函数由一个函数名和一组参数组成,函数名用于指定要执行的特定计算操作,参数则是函数需要的输入数据。
使用函数前,我们需要了解函数的基本概念和使用方法。
1. 函数的语法:函数通常以等号“=”开头,后面是函数名称,接着是左括号“(”,然后是函数的参数,参数之间用逗号“,”分隔,最后以右括号“)”结尾。
例如,求和函数的语法为“=SUM(参数1,参数2,...)”。
2. 函数的参数:函数通常需要接受一些参数进行计算。
参数可以是单元格、数值、常量或其他的函数。
在填写参数时,我们可以直接输入对应的数值,也可以点击单元格引用进入。
多个参数之间用逗号分隔。
3. 自动计算:WPS Office会自动根据我们输入的函数和参数进行计算,并在单元格中显示计算结果。
当参数发生改变时,计算结果也会自动更新。
二、常用的函数及其用法WPS Office提供了各种常用函数,涵盖了基本的数学、逻辑、文本、日期等计算操作。
接下来,我们将介绍一些常用的函数及其用法。
1. SUM函数:用于求和SUM函数可以将多个参数相加,并返回它们的求和结果。
例如,要计算A1单元格和A2单元格的和,可以使用“=SUM(A1,A2)”。
2. AVERAGE函数:用于求平均值AVERAGE函数可以计算一组数值的平均值。
例如,要计算A1到A10的平均值,可以使用“=AVERAGE(A1:A10)”。
用两种方法实现表达式求值

一、设计思想一.中缀式计算结果的设计思想:此种算法最主要是用了两个栈:用两个栈来实现算符优先,一个栈用来保存需要计算的数据numStack(操作数栈),一个用来保存计算优先符priStack(操作符栈)。
从字符串中获取元素,如果是操作数,则直接进操作数栈,但如果获取的是操作符,则要分情况讨论,如下:(这里讨论优先级时暂不包括“(”和“)”的优先级)1.如果获取的操作符a的优先级高于操作符栈栈顶元素b的优先级,则a直接入操作符栈;2.如果获取的操作符a的优先级低于操作符栈栈顶元素b的优先级,则b出栈,a进栈,并且取出操作数栈的栈顶元素m,再取出操作数栈新的栈顶元素n,如果b为+,则用n+m,若为减号,则n-m,依此类推,并将所得结果入操作数栈;3.如果获取的是“(”,则直接进操作符栈;4.如果获取的是“)”,则操作符栈的栈顶元素出栈,做类似于情况2的计算,之后把计算结果入操作数栈,再取操作符栈顶元素,如果不是“(”,则出栈,重复操作,直到操作符栈顶元素为“(”,然后“(”出栈;5.当表达式中的所有元素都入栈后,看操作符栈中是否还有元素,如果有,则做类似于情况2 的计算,并将结果存入操作数栈,则操作数栈中最终的栈顶元素就是所要求的结果。
二.中缀转后缀及对后缀表达式计算的设计思想:中缀转后缀时主要用了一个操作符栈和一个用来存放后缀表达式的栈,从表达式中依次获取元素,如果获取的是操作数,则直接存入s3栈中,如果获取的是操作符也需分情况讨论,如下:(这里讨论优先级时暂不包括“(”和“)”的优先级)1. 如果获取的操作符a的优先级高于操作符栈栈顶元素b的优先级,则a直接入操作符栈;2. 如果获取的操作符a的优先级低于操作符栈栈顶元素b的优先级,则b出栈,a进栈,并且将b存入到操作符栈中;3.如果获取的是“(”,则直接进操作符栈;4.如果获取的是“)”,则操作符栈的栈顶元素出栈,并依次存入到操作符栈中,直到操作符栈栈顶元素为“(”,然后将“(”出栈;5.当表达式中的所有元素都入栈或存入到操作符栈之后,看操作符栈中是否还有元素,如果有,则依次出栈,并且依次存入到操作符栈中,最后打印操作符栈中的字符串,则此字符串即为要求的后缀表达式。
用两种方式实现表达式自动计算

数据结构(双语)——项目文档报告用两种方式实现表达式自动计算专业:网络工程班级:一班指导教师:吴亚峰姓名:陈金广学号:200801040102目录一、设计思想 (03)二、算法流程图 (03)三、源代码 (06)四、运行结果 (18)五、遇到的问题及解决 (19)六、心得体会 (20)一、设计思想程序代码是用两种算法实现中缀表达式转后缀表达式,并计算出表达式的值。
第一种算法是给出一个中缀表达式,编译运行后输出后缀表达式,并计算出后缀表达式的值。
首先,先创建两个数组,一个用于存储输入的中缀表达式,并以“#”结束,一个用于输出后缀表达式。
创建一个操作符栈,初始化并写好出栈入栈函数,用操作符栈存储操作符。
对中缀表达式进行遍历时,遇到数值就直接输入要输出后缀表达式的数组,遇到操作符时,首先对操作符的优先级进行设置,“*”,“/”,“%”的优先级设置为最高,“+”“-”的优先级低于前三个符号,“#”的优先级设置为最低。
对操作符栈进行操作时首先将“#”放入栈顶。
判断栈顶操作符与当前操作符优先级的大小,若当前操作符优先级大的话直接入栈,若当前操作符小于或者等于栈顶运算福的话栈顶操作符出栈,并输入后缀表达式所在的数组,当前操作符再入栈。
遇到“(”时,此时认为“(”的优先级为最高,直接入栈,但是当它入栈后优先级变为最小,当栈顶为“(”时操作符可以直接入栈,其他操作符直接入栈直至遇到“)”时,与“(”配对,括号之间的所有的操作符全部出栈并输入后缀表达式。
继续遍历中缀表达式。
当遍历到“#”时认为遍历中缀表达式结束。
此时操作符栈所有操作符出栈并输入后缀表达式,打印后缀表达式。
得到后缀表达式后,声明并初始化数值栈,写出入栈出栈函数,对后缀表达式进行遍历,遇到数值直接入栈,每遇到操作符,从数值栈栈顶取两个数进行运算,将运算结果入数值栈,继续遍历后缀表达式直至表达式结束,得到的结果就是后缀表达式的计算值。
第二种算法不将中缀表达式转换为后缀表达式,而是直接对中缀表达式进行操作,开始声明并初始化栈,一个操作符栈,一个数值栈。
(完整版)数学表达式计算(c语言实现)

一、设计思想计算算术表达式可以用两种方法实现:1.中缀转后缀算法此算法分两步实现:先将算术表达式转换为后缀表达式,然后对后缀表达式进行计算.具体实现方法如下:(1)中缀转后缀需要建一个操作符栈op和一个字符数组exp,op栈存放操作符,字符数组用来存放转换以后的后缀表达式。
首先,得到用户输入的中缀表达式,将其存入str数组中。
对str数组逐个扫描,如果是数字或小数点,则直接存入exp数组中,当扫描完数值后,在后面加一个#作为分隔符。
如果是操作符,并且栈为空直接入栈,如果栈不为空,与栈顶操作符比较优先等级,若比栈顶优先级高,入栈;如果比栈顶优先级低或相等,出栈将其操作符存到exp数组中,直到栈顶元素优先等级低于扫描的操作符,则此操作符入栈;如果是左括号,直接入栈,如果是右括号,出栈存入exp数组,直到遇到左括号,左括号丢掉。
然后继续扫描下一个字符,直到遇到str中的结束符号\0,扫描结束。
结束后看op栈是否为空,若不为空,继续出栈存入exp数组中,直到栈为空.到此在exp数组最后加结束字符\0。
我们就得到了后缀表达式。
(2)后缀表达式计算此时需要一个数值栈od来存放数值。
对exp数组进行逐个扫描,当遇到数字或小数点时,截取数值子串将其转换成double类型的小数,存入od栈中。
当遇到操作符,从栈中取出两个数,进行计算后再放入栈中。
继续扫描,知道扫描结束,此时值栈中的数值就是计算的结果,取出返回计算结果。
2。
两个栈实现算法此算法需要两个栈,一个值栈od,一个操作符栈op。
将用户输入的数学表达式存入str数组中,对其数组进行逐个扫描。
当遇到数字或小数点,截取数值子串,将其转换成double类型的数值存入od栈中;当遇到左括号,直接入op栈;遇到右括号,op栈出栈,再从值栈od中取出两个数值,计算将其结果存入值栈中,一直进行此操作,直到操作符栈栈顶为左括号,将左括号丢掉。
如果遇到操作符,若op栈为空,直接入栈;若栈不为空,与栈顶元素比较优先等级,若比栈顶操作符优先等级高,直接入op栈,如果低于或等于栈顶优先等级,op栈出栈,再从值栈中取出两个数值,计算将其结果存入值栈中,一直进行此操作,直到栈顶优先等级低于扫描的操作符等级,将此操作符入op 栈。
用两种方式实现表达式自动计算培训资料

用两种方式实现表达式自动计算数据结构(双语)——项目文档报告用两种方式实现表达式自动计算专业:计算机科学与技术应用班级:指导教师:吴亚峰姓名:学号:目录一、设计思想 (01)二、算法流程图 (01)三、源代码 (03)四、运行结果 (15)五、遇到的问题及解决 (16)六、心得体会 (17)一、设计思想A: 中缀表达式转后缀表达式的设计思想:我们借助计算机计算一个算数表达式的值,而在计算机中,算术表达式是由常量,变量,运算符和括号组成。
由于运算符的优先级不同又要考虑括号。
所以表达式不可能严格的从左到右进行,因此我们借助栈和数组来实现表达式的求值。
栈分别用来存储操作数和运算符。
在计算表达式的值之前,首先要把有括号的表达式转换成与其等值的无括号的表达式,也就是通常说的中缀表达式转后缀表达式。
在这个过程中,要设计两个栈,一个浮点型的存储操作数,用以对无符号的表达式进行求值。
另一个字符型的用来存储运算符,用以将算术表达式变成无括号的表达式;我们要假设运算符的优先级:( ) , * /, + - 。
首先将一标识号‘#’入栈,作为栈底元素;接着从左到右对算术表达式进行扫描。
每次读一个字符,若遇到左括号‘(’,则进栈;若遇到的是操作数,则立即输出;若又遇到运算符,如果它的优先级比栈顶元素的优先级数高的话,则直接进栈,否则输出栈顶元素,直到新的栈顶元素的优先级数比它低的,然后将它压栈;若遇到是右括号‘)’,则将栈顶的运算符输出,直到栈顶的元素为‘(’,然后,左右括号互相底消;如果我们设计扫描到‘#’的时候表示表达式已经扫描完毕,表达式已经全部输入,将栈中的运算符全部输出,删除栈底的标识号。
以上完成了中缀表达式转后缀表达式,输出无括号的表达式,若遇数值,操作数进栈;若遇运算符,让操作数栈的栈顶和次栈顶依次出栈并与此运算符进行运算,运算结果入操作数栈;重复以上的步骤,直到遇到‘#’,则此时栈中的结果便是所求的后缀表达式的值,接着输出结果。
数据结构课程设计---用两种方式实现表达式自动计算

一、设计思想(一)中缀转后缀的设计思想设计一个能实现表达式自动求值计算,算术表达式由操作数、算符和括号组成。
由于运算符的优先级不同还要考虑括号。
所以表达式不可能一直的从左到右进行,所以就借助栈来实现这个表达式的求值。
首先要把算术表达式变换成与之等值的无括号表达式,也就是中缀转后缀,它也是这个算法的关键。
设计两个栈,一个为字符型的,存放运算符,用以将算术表达式变成无括号的表达式;另一个浮点型的,存放操作数,用以对无符号的表达式进行求值。
我们要假设运算符的优先级:( ) , * /, + - 。
首先将一左括号‘(’入栈,作为栈底元素;接着从左到右对算术表达式进行扫描。
每次读一位,若遇到左括号‘(’,则进栈;若遇到的是操作数,则立即输出;若又遇到运算符,如果它的优先级比栈顶元素的优先级数高的话,则直接进栈,否则输出栈顶元素,直到新的栈顶元素的优先级数比它低的,然后将它压栈;若遇到是右括号‘)’,则将栈顶的运算符输出,直到栈顶的元素为‘(’,然后,左右括号互相底消;到设计的结束标志的时候表示表达式已经扫描完毕,表达式已经全部输入,将栈中的运算符全部输出,删除栈底的左括号。
以上完成了中缀表达式转后缀表达式,输出无括号的后缀表达式。
读后缀表达式,若遇数值,操作数进栈;若遇运算符,让操作数栈的栈顶和次栈顶依次出栈并与此运算符进行运算,运算结果入操作数栈;重复这个步骤,直到遇到结束标志,则此时栈中的结果便是所求的后缀表达式的值,接着输出结果。
以上就是设计这个算法的主要的思想。
(二) 直接计算的设计思想直接计算其实跟上一个相似,它是在上面扫两遍的思想进行修改的得来。
首先,要建立两个栈,一个为字符型的,存放运算符,另一个浮点型的,存放操作数,我们开始对表达式进行扫描。
首先要确定运算符的优先级:(、)、*、/、+、-。
如果扫描到的是数字符号,把它们转换成浮点型数据或其他可运算的数据类型,存入操作数栈中。
如果扫描到的是运算符号,第一个运算符进栈,遇到‘(’存入运算符栈中,我们按照第一种算法的方法将表达式依次扫描。
c两种方法实现表达式的计算

数据结构(双语)——项目文档报告用两种方式实现表达式自动计算专业:网络工程班级:网络1班指导教师:吴亚峰姓名:王嘉宇学号:201214620111目录一、设计思想 (01)二、算法流程图 (01)三、源代码 (04)四、运行结果 (12)五、遇到的问题及解决 (13)六、心得体会 (14)一、设计思想(1)先将中缀表达式转化为后缀表达式,再通过计算后缀表达式求表达式的值。
第一遍扫描中缀表达式,需要一个运算符栈和一个数组。
运算符栈用来存放运算符,数组用来存放转换成的后缀表达式。
首先将中缀表达式挨个扫描。
如果是数字,则直接放在后缀表达式数组中,依次存放。
如果扫描到的是运算符,则按照以下规则存放:栈空时,任何运算符可直接入栈。
栈不空是,如果栈中运算符的优先级高于或等于将要放入栈中的运算符的优先级,则将栈中运算符出栈,放入后缀表达式数组中,直到栈中运算符优先级低于将要放入栈中的运算符的优先级,此时将此运算符放入运算符栈中。
如果遇到左括号,则直接将左括号入栈,左括号入栈后优先级最低,其他运算符可直接放入。
如果遇到右括号,则将运算符栈中的运算符依次取出放到后缀表达式数组中,直到遇到左括号为止,此时将左括号从栈顶删除。
按此方法,直到后缀表达式转换成功。
第二遍扫描后缀表达式,此时需要一个数栈。
扫描时如果遇到数字,则直接放到数栈中。
如果遇到运算符,则将数栈中两个数取出,先取出的放在运算符后面,后取出的放在运算符前面,进行运算符运算。
将运算的结果放入栈中。
之后接着扫描后缀表达式。
另外因为运算数的位数不一定而且还有小数点,所以在扫到一个数时要判断这个数的位数,将这个完整的运算数字符串整个取出,这需要用到一个辅助索引。
当栈中只有一个数字时,这个数字就是我们要求的表达式的值。
(2)直接计算表达式的值。
这种方法需要两个栈,一个运算符栈,一个数栈。
只需扫描一遍中缀表达式,边运算边入栈。
当扫描到的为数字是,将其放入数栈中,然后扫描下一个字符。
计算式函数自动计算公式

如何使用计算式函数自动计算公式计算式函数是一种在电子表格软件中非常常用的功能,它可以帮助用户自动计算各种公式。
以下是一些使用计算式函数自动计算公式的技巧和提示。
1. SUM函数:这是计算电子表格中一列或一行数值之和的最基本的计算式函数。
要使用SUM函数,只需选择需要计算的列或行并在其上输入“=SUM(选择该列或行)”即可。
2. AVERAGE函数:与SUM函数类似,AVERAGE函数也是用于计算一列或一行平均值的函数。
要使用AVERAGE函数,只需输入“=AVERAGE(选择该列或行)”即可。
3. MAX和MIN函数:MAX和MIN函数分别用于寻找一列或一行的最大和最小值。
要使用MAX函数,只需输入“=MAX(选择该列或行)”;要使用MIN函数,只需输入“=MIN(选择该列或行)”。
4. IF和IFERROR函数:IF函数可以根据特定条件选择计算式函数要执行的操作。
例如,如果一个单元格中的值大于10,则执行AVERAGE函数;否则执行SUM函数。
“=IF(A1>10,AVERAGE(A1:A5),SUM(A1:A5))”即可。
IFERROR函数用于处理错误,当计算式函数发生错误时,可以使用IFERROR函数将错误信息替换为特定的字符串。
例如,“=IFERROR(SUM(A1:A5),“错误信息”)”。
5. VLOOKUP和HLOOKUP函数:这两个函数用于在表格中查找特定条件并返回相应的值。
VLOOKUP函数用于垂直方向,HLOOKUP函数用于水平方向。
例如,“=VLOOKUP(A1,A2:B5,2,FALSE)”表示在范围A2:B5中查找A1的值,并返回查找结果的第二列。
通过以上技巧和提示,相信您可以更加高效地使用计算式函数自动计算公式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构(双语)——项目文档报告用两种方式实现表达式自动计算专业:计算机科学与技术应用班级:指导教师:吴亚峰姓名:学号:目录一、设计思想 (01)二、算法流程图 (01)三、源代码 (03)四、运行结果 (15)五、遇到的问题及解决 (16)六、心得体会 (17)一、设计思想A: 中缀表达式转后缀表达式的设计思想:我们借助计算机计算一个算数表达式的值,而在计算机中,算术表达式是由常量,变量,运算符和括号组成。
由于运算符的优先级不同又要考虑括号。
所以表达式不可能严格的从左到右进行,因此我们借助栈和数组来实现表达式的求值。
栈分别用来存储操作数和运算符。
在计算表达式的值之前,首先要把有括号的表达式转换成与其等值的无括号的表达式,也就是通常说的中缀表达式转后缀表达式。
在这个过程中,要设计两个栈,一个浮点型的存储操作数,用以对无符号的表达式进行求值。
另一个字符型的用来存储运算符,用以将算术表达式变成无括号的表达式;我们要假设运算符的优先级:( ) , * /, + - 。
首先将一标识号‘#’入栈,作为栈底元素;接着从左到右对算术表达式进行扫描。
每次读一个字符,若遇到左括号‘(’,则进栈;若遇到的是操作数,则立即输出;若又遇到运算符,如果它的优先级比栈顶元素的优先级数高的话,则直接进栈,否则输出栈顶元素,直到新的栈顶元素的优先级数比它低的,然后将它压栈;若遇到是右括号‘)’,则将栈顶的运算符输出,直到栈顶的元素为‘(’,然后,左右括号互相底消;如果我们设计扫描到‘#’的时候表示表达式已经扫描完毕,表达式已经全部输入,将栈中的运算符全部输出,删除栈底的标识号。
以上完成了中缀表达式转后缀表达式,输出无括号的表达式,若遇数值,操作数进栈;若遇运算符,让操作数栈的栈顶和次栈顶依次出栈并与此运算符进行运算,运算结果入操作数栈;重复以上的步骤,直到遇到‘#’,则此时栈中的结果便是所求的后缀表达式的值,接着输出结果。
以上就是设计这个算法的主要的思想。
设计思想的流程图详见图A;B: 直接计算表达式的值。
所谓的扫一遍就是当扫完一个表达式结果也就计算出来了,是在上面扫两遍的思想进行修改的得来,首先,我们要建立两个栈,一个为字符型的用来存放运算符,另一个浮点型的用来存放操作数。
我们开始对表达式进行扫描,首先我们要假设运算符的优先级:( ) , * /, + - 。
如果扫描到的是数字符号,把它们转换成浮点型数据,存入操作数栈中。
如果扫描到的是运算符号,第一个运算符进栈,遇到‘(’存入运算符栈中,我们按照第一种算法的方法将表达式依次扫描。
只不过不同的是,当每取得的一个运算符的时候,都要与栈顶的运算符进行比较,如果它的优先级小于栈顶运算符优先级时,取出栈顶运算符并从操作数栈中取栈顶两个数进行运算,得到的结果则要存回操作数栈,就这样边扫描边比较,再进行计算。
遇到“)”对运算符的处理相同。
扫描结束后,把运算符栈的元素和操作数栈里的数进行运算。
每次的运算结果再放入操作数栈,一直到计算到运算符栈空。
最后操作数栈的栈顶留下的操作数即表达式的计算结果。
以上就是设计这个扫一遍算法的主要的思想。
设计思想的流程图详见图B;二、算法流程图A:以下是中缀转后缀算法的流程图图2是中缀转后缀算法的流程图B:以下是扫一遍代码运算的流程图:图B是直接计算的流程图三、源代码A:下面给出的是用中缀表达式转后缀表达式算法实现的程序的源代码:#include <stdio.h> /*I/O函数*/#include <malloc.h>#include <stdlib.h>#define MAXLEN 100 /*对栈的最大存贮值进行定义*//*自定义两个栈*/typedef struct stackData{float data[MAXLEN];int top; /*指针*/}stackData; /*定义存储操作数的栈*/typedef struct stackChar{char data[MAXLEN];int top; /*指针*/}stackChar; /*用于定义存储操作符号的栈*//*对相应的函数和常量变量,指针进行声明*/int judgeFirst(char c); /*声明判定操作符优先级的函数*/int PushNum(stackData *p,float value); /* 入栈*/int PushChar(stackChar *p,char value);int PopNum(stackData *p,float *value); /* 出栈*/int PopChar(stackChar *p,char *value);float VisitNum(stackData * p);char visitChar(stackChar * p);float Compute(float a,char ch,float b); /* 操作函数,执行具体运算*/int Check(char *);stackData *Data; /*定义操作数栈,由指针data指出*/stackChar *Operation;stackData * InitNum();stackChar * InitChar();int i,j=0;float bl,blo; /*对变量进行声明*/float resoult,opA,opB;char operand[2],opChar; /*定义字符型数组和字符变量*/char recv[MAXLEN];float suffix[MAXLEN];char *ptRecv=NULL; /*定义字符型指针*/int main() /*主函数*/{printf("please enter tne formula:");while((scanf("%s",recv))!=EOF) /*判断循环的条件当输入EOF的时候停止*/ {Operation = InitChar();Data = InitNum();PushChar(Operation,'#');recv[strLen(recv)]='#'; /*将字符#赋予数组最后*/ptRecv = recv;for(i=0;i<strLen(ptRecv);i++) /*扫描表达式,判断循环的条件*/{if(recv[i]>='0' && recv[i]<='9' || recv[i]=='.') /*判断数值*/{double weight=0.1;int flag=0; /*定义变量flag,用来标志小数点*/float blo=0; /*定义浮点型变量*/blo=recv[i]-'0';while(recv[i+1]>='0' && recv[i+1]<='9' || recv[i+1]=='.') /*判定数值*/{if(recv[i+1]=='.') /*读到小数点*/flag=1;else{if(flag==0) blo=blo*10+recv[i+1]-'0'; /*将整数部分字符串转化为实数*/else{blo=blo+( recv[i+1]-'0' )*weight; /*将表示小数部分的字符也转化过来*/weight*=0.1; /*weight为小数位权*/}}i++;}suffix[j]=blo;j++; /*数值进入数组*/}else{if(recv[i]=='#') /*遇见字符#*/{while(visitChar(Operation)!='#') /*对操作符栈进行遍历*/{PopChar(Operation,&opChar);suffix[j]=opChar;j++; /*字符出栈进入数组*/}}else{if(judgeFirst(recv[i])>judgeFirst(visitChar(Operation))||visitChar(Operation)=='(') /*判断操作符的优先级高低*/ {PushChar(Operation,recv[i]); /*字符入栈*/}else{if(recv[i]==')') /*遇见字符)*/{while(visitChar(Operation)!='(') /*输出(之前的所有操作符*/{PopChar(Operation,&opChar);suffix[j]=opChar;j++; /*操作符进入数组*/}PopChar(Operation,&opChar);}else{while(judgeFirst(recv[i])<=judgeFirst(visitChar(Operation))) /*进栈的运算符优先级低时,先出栈后进栈*/{PopChar(Operation,&opChar);suffix[j]=opChar; /*出栈的进入数组*/j++;}PushChar(Operation,recv[i]); /*运算符进栈*/}}}}}printf("the suffix is:"); /*输出后缀表达式*/for(j=0;suffix[j]!='\0';j++){if((char)suffix[j]=='+'||(char)suffix[j]=='-'||(char)suffix[j]=='*'||(char)suffix[j]=='/') /*强制类型转换*/{printf("%6c",(char)suffix[j]); /*输出一个运算符*/PopNum(Data,&opA);PopNum(Data,&opB);resoult = Compute(opB,(char)suffix[j],opA); /*调用函数进行运算*/PushNum(Data,resoult); /*运算结果入栈*/}else{PushNum(Data,suffix[j]);printf("%10f",suffix[j]) /*输出后缀表达式*/;}}printf("\nthe Result is:%.2f\n\n",resoult); /*输出运算结果*/}return 0;}stackData * InitNum() /*初始化数值栈*/{stackData *p = (stackData *)malloc(sizeof(stackData)); /*取一段内存赋予数值栈*/ p->top = -1; /*定义栈底*/return p; /*返回数值栈*/}stackChar * InitChar() /*初始化操作符栈*/{stackChar *p = (stackChar *)malloc(sizeof(stackChar)); /*取一段内存赋予操作符栈*/ p->top = -1;return p;}int PushNum(stackData *p,float value) /*定义入栈函数*/{if(p->top < MAXLEN-1){p->top +=1; /*指针*/p->data[p->top] = value; /*入栈的数值为栈顶元素*/return 1;}else{return 0;}}int PushChar(stackChar *p,char value) /* 定义操作符入栈函数*/{if(p->top < MAXLEN-1) /*栈不能满*/{p->top +=1; /*指针*/p->data[p->top] = value; /*入栈字符为栈顶元素*/return 1;}else{return 0; /*栈溢出返回0*/}}int PopNum(stackData *p,float *value) /*定义数值出栈函数*/{if(p->top >= 0) /*判定栈不为空*/{*value = p->data[p->top];p->top -= 1; /*指针*/}return 1;}int PopChar(stackChar *p,char *value) /*定义操作符出栈函数*/ {if(p->top >= 0) /*判定栈不为空*/{*value = p->data[p->top];p->top -= 1; /*指针*/}return 1;}float VisitNum(stackData * p) /*定义数值栈遍历函数*/{if(p->top!=-1) /*判定栈是否为空*/return p->data[p->top];else return 0;}char visitChar(stackChar * p) /*定义操作符栈遍历函数*/{if(p->top!=-1) /*判定栈是否为空*/return p->data[p->top];else return 0;}int judgeFirst(char c) /*符号的优先级*/{switch(c){case '#': return 0; /*#的优先级*/case '+':return 1;case '-':return 1; /*减号的优先级*/case '*':return 2;case '/':return 2;case '(':return 3; /*左括号的优先级*/default : return -1;}}int strLen(char *L) /*计算字符串长度*/{int i = 0;for(;L[i]!='\0';i++); /*循环条件的判定*/if(L[0]=='-'||L[0]=='+'){i=i-1;}return i;}float Compute(float a,char ch,float b) /*数据运算*/{switch(ch){case '+':return a+b; /*返回加号数值运算结果*/case '-':return a-b;case '*':return a*b; /*返回乘号数值运算结果*/case '/':return a/b; /*返回除号数值运算*/default : return -1; }}B:下面给出的是直接计算的思想的代码实现:#include <stdio.h> /*I/O函数*/#include <malloc.h>#include <stdlib.h>#define MAXLEN 100 /*对栈的最大存储值进行声明*//*声明用来存储操作数和运算符的栈*/typedef struct stackData{float data[MAXLEN];int top;}stackData; /*定义操作数的栈*/typedef struct stackChar{char data[MAXLEN];int top;}stackChar; /* 用于定义运算符的栈*//*对函数进行声明*/int judgeFirst(char c); /*声明判定操作符优先级的函数*/ char visitChar(stackChar * p);int pushNum(stackData *p,float value); /* 操作数入栈*/int PushChar(stackChar *p,char value); /* 运算符入栈*/int PopNum(stackData *p,float *value); /* 操作数出栈*/int PopChar(stackChar *p,char *value); /* 运算符出栈*/float VisitNum(stackData * p);float Compute(float a,char ch,float b); /* 操作函数,执行具体运算*/int main() /*主函数*/{stackData * InitNum();stackChar * InitChar();int Check(char *);stackData *Data; /*定义操作数栈,由指针data指出*/stackChar *Operation; /*定义运算符栈,由指针Operation指出*/int i; /*对变量进行声明*/float dit,digit;float resoult,opA,opB;char operand[2],opChar; /*定义字符型数组和字符变量*/char recv[MAXLEN];char *ptRecv=NULL; /*定义字符型指针*/printf ("please enter the formula:");while((scanf("%s",recv))!=EOF) /*判断循环的条件当输入EOF的时候停止*/{Data = InitNum();Operation = InitChar();PushChar(Operation,'#');recv[strLen(recv)]='#'; /*将字符#赋予数组最后*/ptRecv = recv;for(i=0;i<strLen(ptRecv);i++) /*判定循环的条件*/{if(recv[i]>='0' && recv[i]<='9' || recv[i]=='.') /*判断值*/{double weight=0.1;int flag=0; /*定义整形变量flag,记录是否有小数点*/float digit=0; /*定义浮点型变量*/digit=recv[i]-'0';while(recv[i+1]>='0' && recv[i+1]<='9' || recv[i+1]=='.') /*判定数值*/{if(recv[i+1]=='.') /*读到小数点*/flag=1;else{if(flag==0) digit=digit*10+recv[i+1]-'0'; /*将整数部分字符串转化为实数*/else{digit=digit+( recv[i+1]-'0')*weight; /*将表示小数部分的字符也转化过来*/weight*=0.1; /*weight为小数位权*/}}i++;}pushNum(Data,digit); /*将数值进栈*/}else{if(recv[i]=='#') /*遇见字符#*/{while(visitChar(Operation)!='#') /*对操作符栈进行遍历*/{PopChar(Operation,&opChar); /*字符出栈*/PopNum(Data,&opA);PopNum(Data,&opB); /*数出栈*/resoult = Compute(opB,opChar,opA); /*调用运算函数*/pushNum(Data,resoult);}}else{if(judgeFirst(recv[i])>judgeFirst(visitChar(Operation))||visitChar(Operation)=='(')/*判断操作符的优先级高低*/ {PushChar(Operation,recv[i]); /*操作符进栈*/}else{if(recv[i]==')') /*当操作符为)时*/{while(visitChar(Operation)!='(') /*遍历操作符栈*/{PopChar(Operation,&opChar);PopNum(Data,&opA);PopNum(Data,&opB); /*从数值栈输出一个值*/resoult = Compute(opB,opChar,opA);pushNum(Data,resoult);/*结果放回栈里*/}PopChar(Operation,&opChar); /*输出操作符*/}else{while(judgeFirst(recv[i])<=judgeFirst(visitChar(Operation))) /*判断操作符的优先级高低*/{PopChar(Operation,&opChar);PopNum(Data,&opA); /*从数值栈输出数值*/PopNum(Data,&opB);resoult = Compute(opB,opChar,opA); /*调用运算函数*/pushNum(Data,resoult); /*将运算结果入栈*/}PushChar(Operation,recv[i]); /*将操作符入栈*/}}}}}printf("\nthe Result is:%.2f\n\n",resoult);/*输出扫描一遍的运算结果*/}return 0;}stackData * InitNum() /*初始化数值栈*/{stackData *p;p= (stackData *)malloc(sizeof(stackData)); /*取一段内存赋予数值栈*/p->top = -1; /*定义栈底*/return p; /*返回数值栈*/}stackChar * InitChar() /*初始化操作符栈*/{stackChar *p = (stackChar *)malloc(sizeof(stackChar)); /*取一段内存赋予操作符栈*/p->top = -1;return p;}int pushNum(stackData *p,float value) /*定义入栈函数*/{if(p->top < MAXLEN-1) {p->top +=1; /*指针*/p->data[p->top] = value; /*入栈的数值为栈顶元素*/return 1;}else{return 0;}}int PushChar(stackChar *p,char value) /* 定义操作符入栈函数*/ {if(p->top < MAXLEN-1){p->top +=1; /*指针*/p->data[p->top] = value; /*入栈字符为栈顶元素*/return 1;}else{return 0; /*栈溢出返回0*/}}int PopNum(stackData *p,float *value) /*定义数值出栈函数*/ {if(p->top >= 0) /*判定栈不为空*/{*value = p->data[p->top];p->top -= 1; /*指针*/}return 1;}int PopChar(stackChar *p,char *value) /*定义操作符出栈函数*/ {if(p->top >= 0) /*判定栈不为空*/{*value = p->data[p->top];p->top -= 1; /*指针*/}return 1;}float VisitNum(stackData * p) /*定义数值栈遍历函数*/ {if(p->top!=-1) /*判定栈是否为空*/return p->data[p->top];else return 0;}char visitChar(stackChar * p) /*定义操作符栈遍历函数*/ {if(p->top!=-1) /*判定栈是否为空*/return p->data[p->top]; /*返回栈顶的值*/ else return 0;}int judgeFirst(char c) /*符号的优先级*/{switch(c){case '#': return 0;case '+':return 1; /*加号的优先级*/case '-':return 1;case '*':return 2; /*乘号的优先级*/case '/':return 2; /*除号的优先级*/case '(':return 3;default : return -1;}}int strLen(char *L) /*计算字符串长度*/{int i = 0;for(;L[i]!='\0';i++); /*循环条件的判定*/if(L[0]=='-'||L[0]=='+'){i=i-1;}return i;}float Compute(float a,char ch,float b)/*数据运算*/{switch(ch){case '+':return a+b; /*返回加号数值运算*/case '-':return a-b; /*返回减号数值运算*/case '*':return a*b;case '/':return a/b; /*返回除号数值运算*/default : return -1;}}四、运行结果A:首先我们通过中缀表达式转换为后缀表达式来计算表达式图C:上图是利用中缀表达式转后缀表达式B:其次我们直接来计算表达式的值图D:这次是利用直接计算来实现的结果五、遇到的问题及解决这部分我主要遇到了如下几个个问题,其内容与解决方法如下所列:C语言中没有string类型,所以不能直接声明string类型的变量来存储输入的表达式,也不能直接声明一个字符串数组来存储截取的数字字符串。