【题目要求】
【问题描述】
设计一个简单的算术表达式计算器。
【基本要求】
实现标准整数类型的四则运算表达式的求值(包含括号,可多层嵌入).
【测试数据】
(30+2*70)/3-12*3
5+(9*(62-37)+15)*6
要求自行设计非法表达式,进行程序测试,以保证程序的稳定运行。
【实现提示】
可以设计以下辅助函数
status isNumber(char ReadInChar); //视ReadInchar 是否是数字而返回 TRUE 或 FALSE 。
int TurnToInteger(char IntChar); // 将字符’0’.’9’ 转换为整数 9
【需求分析】
1)实现标准整数类型的四则运算表达式(加减乘除)的求值。
2)包括括号,可多层嵌入。
3)要求自行设计非法表达式,进行程序测试,以保证程序的稳定运行。
【难点分析】
1)小数点,空置格,括号匹配
2)中缀表达式的求值是我们人最熟悉的,但是对计算机来说却不好操作。因此,在计算结果时,往往会将中缀表达式转成其它表达式来操作(一般转成后缀表达式。)
3)后缀表达式求解
4)从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 和 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果
【设计思路】
要实现完整计算式的输入并运算,就得用到计算后缀表达式的算法,和将中缀表达式转换为后缀表达式的算法(这里不再赘述中缀表达式和后缀表达式,以及之后有关栈的知识也不再多说,有兴趣可以阅读数据结构中关于栈的相关章节),这里重点讲解以上两个算法。
算法1(中缀表达式转后缀表达式):
因为计算式要在计算器的文本编辑框中显示,所以计算式用字符串记录(定义为字符串)
规则:从左向右遍历中缀表达式
①:遇到数字字符,直接加入后缀表达式
②:遇到高优先级运算符,若栈为空直接入栈,若栈不为空,则将当前运算符与栈顶元素比较
比较1(栈顶元素也为高优先级运算符):栈顶元素出栈加入后缀表达式,当前运算符入栈。这样的操作使得栈中不会出现连续的高优先级运算符
比较2(栈顶元素为'('左括号):将当前元素入栈
比较3(栈顶元素为低优先级运算符):将当前元素入栈
③:遇到'('左括号,将左括号入栈
④:遇到')'右括号,将栈顶元素顺序出栈,直到栈顶元素为左括号,此时删去栈顶的左括号
⑤:遇到低优先级运算符,若栈为空直接入栈,若栈不为空,则将当前运算符与栈顶元素比较
比较1(栈顶元素也为低优先级运算符):栈顶元素出栈加入后缀表达式,当前运算符入栈。这样的操作使得栈中不会出现连续的低优先级运算符
比较2(栈顶元素为'('左括号):将当前运算符入栈
比较3(栈顶元素为高优先级运算符):栈顶元素出栈加入后缀表达式,当前运算符入栈
算法2:计算后缀表达式
计算后缀表达式依然借助栈来实现
运算规则:遍历后缀表达式
①:遇到数字字符,直接入栈
②:遇到运算符,顺序出栈两个元素(数字),进行运算,将运算结果入栈
循环以上步骤最终栈中剩下的那个数字就是最终答案
算法3:开方运算(调用Math.sqrt()函数)
算法4:平方运算(调用Math.pow()函数)