我正在用Java创建一个计算器,正在努力想出一种处理负数的方法,到目前为止,我可以解析一个表达式,例如:
((4-3)*(4/2))*2
变成:
[4.0, -3.0, +, 4.0, 2.0, /, *, 2.0, *]
然而,我不知道如何处理包含否定的表达式,例如:
2*(-2-3)
到目前为止,我有一个这样的表达式,当遇到负值时,它将前面的数字乘以-1,并在列表的末尾添加一个+,所以表达式变成了这样:
[2.0, -2.0, -3.0, +, +, *]
这在我的程序中导致了很多错误,有没有人能帮我找到一个更好的方法来处理负片。
非常感谢你的帮助
发布于 2014-01-07 01:04:03
Vladp是正确的,但需要补充一些说明。
您正在实现将infix notation转换为postfix notation的Shunting Yard algorithm,也就是反向波兰符号。
您遇到的问题是您没有区分-
字符/符号/运算符的binary减法和unary negate。
所以对于
2*(-2-3)
您可以将其转换为AST,如下所示
*
/ \
- (b) 2
/ \
- (u) 3
/
2
其中- (b)是二进制减法,- (u)是一元否定。
或RPN as
2-3-2*
并评估为
2 - 3 - 2 *
(-2) 3 - 2 *
(-5) 2 *
-10
当你计算一元否定时,只需将一元运算符和next数字从堆栈中取出,并将该数字的负值推入堆栈。一元否定并不意味着负数的倍数,而是将操作数转换为负数。
所以-5
被否定就是-5
被否定的5
是-5
。
存储负号的值时,必须使用两个不同的运算符,一个用于二进制,另一个用于一元。此外,在计算运算符时,必须对一元运算符和二元运算符使用不同的情况。
发布于 2014-01-06 20:09:38
创建两种不同的-
类型,
对单个值起作用的一种方法,只需将其变为负值:
-(2+3)
[2, 3, +, type1-]
第二,它的工作方式类似于+
2-3
[2, 3, type2-]
在一起,你应该得到:
2--3
[2, 3, type1-, type2-]
-2-(-3)
[2, type1-, 3, type1-, type2-]
当您遇到没有参数等待计算的-
时,它为type1,否则为type2。
发布于 2014-01-06 23:56:53
好吧,这是我的两点价值:
我怀疑像你所做的那样,把一个包含圆括号、圆括号等的方程式分解成一个数组,会导致很多困难。我建议您改为以编程方式深入到最深的父系,处理数据,然后向外工作。在Google上可能有关于如何做到这一点的在线例子。
https://stackoverflow.com/questions/20949556
复制相似问题