我正在用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, +, +, *]
这导致我的程序出现很多错误,任何人都可以帮助更好地处理否定数据。
非常感谢您的帮助
答案 0 :(得分:2)
Vladp是正确的,但要添加一些说明。
您正在实施Shunting Yard algorithm以将infix notation转换为postfix notation,即AKA反向波兰表示法。
您遇到的问题是,您无法区分binary减法和-
字符/符号/运算符的unary否定。
所以
2*(-2-3)
您可以将其转换为AST
*
/ \
- (b) 2
/ \
- (u) 3
/
2
with - (b)二元减法和 - (u)一元否定。
或RPN为
2-3-2*
评估为
2 - 3 - 2 *
(-2) 3 - 2 *
(-5) 2 *
-10
当你评估一元否定时,只需将一元运算符和下一个数字从堆栈中取出并在堆栈上推送该数字的负数。一元否定并不意味着负数,而是将操作数转换为负数。
-5
否定的是-5
而5
否定的是-5
。
存储负号的值时,必须使用两个不同的运算符,一个用于二进制,一个用于一元。此外,在评估运算符时,必须为一元和二元运算符设置单独的大小写。
答案 1 :(得分:1)
制作两种不同的-
类型
只针对单个值,只需将其变为负数:
-(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。
答案 2 :(得分:0)
嗯,这是我的两分钱:
我怀疑将包含括号,括号内等的方程式分解为数组,因为你所做的将导致很多困难。我建议你以编程方式深入研究最深层的父母,处理数据,然后向外工作。 Google可能会提供有关如何执行此操作的在线示例。