繁体   English   中英

Java计算器,如何处理负数

[英]Java calculator, how to handle negative numbers

我正在用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, +, +, *]

这导致了我的程序中的许多错误,任何人都可以帮助更好的方法来处理否定。

非常感谢您的帮助

弗拉德普是正确的,但要补充一些说明。

您正在实施Shunting Yard算法将中缀表示法转换为后缀表示法 ,AKA反向波兰表示法。

你遇到的问题是你没有区分二进制减法和-字符/符号/运算符的一元否定。

因此对于

2*(-2-3)

您可以将其转换为AST as

       *
      / \
  - (b)  2
    / \
- (u)  3
  /
 2

- (b)二元减法和 - (u)一元否定。

或RPN为

2-3-2*  

并评估为

2 - 3 - 2 *
(-2) 3 - 2 *
(-5) 2 *
-10 

当你评估一元否定时,只需将一元运算符和下一个数字从堆栈中取出并在堆栈上推送该数字的负数。 一元否定并不意味着负数,而是将操作数转换为负数。

所以-5否定是-5
5否定是-5

存储负号的值时,必须使用两个不同的运算符,一个用于二进制,一个用于一元。 此外,在评估运算符时,必须为一元和二元运算符分别设置一个案例。

让两个不同的-种,

一个只对单个值起作用的东西,只需将其变为负数:

-(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否则。

好吧,这是我的两分钱:

我怀疑将包含括号,括号内等的方程式分解为数组,因为你所做的将导致很多困难。 我建议你以编程方式深入研究最深层的父母,处理数据,然后向外工作。 Google可能会提供有关如何执行此操作的在线示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM