【问题标题】:Java calculator, how to handle negative numbersJava计算器,如何处理负数
【发布时间】:2014-01-23 19:59:03
【问题描述】:

我正在用 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*(-2-3) 将变为 2*(0-2-3)
  • 感谢您的快速回复,我已经尝试过了,但是当我有一个像 8*-2 这样的表达式时,我会得到列表 [8.0, 0.0, *, -2.0, +] 这会导致-2的答案
  • 那你解析错了,8*-2应该是[8, 0, 2, -, *],你读到8 => [8],你读到*然后调用解析下一个参数,你读到 - 和 2 => [8, 0, 2, -],现在你完成 * => [8, 0, 2, -, *]
  • 也许你应该发布你是如何解析的,问题可能就在那里。

标签: java list parsing calculator negative-number


【解决方案1】:

Vladp 是正确的,但要添加一些说明。

您正在实施 Shunting Yard algorithm 以将 infix notation 转换为 postfix notation,AKA 逆波兰表示法。

您遇到的问题是您没有区分binary 减法和- 字符/符号/运算符的unary 否定。

所以对于

2*(-2-3)

您可以将其转换为 AST

       *
      / \
  - (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】:

    制作两种不同的- 类型,

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

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

    【讨论】:

      【解决方案3】:

      嗯,这是我的两分钱:

      我怀疑像你所做的那样将包含括号、括号内等的方程分解成一个数组会导致很多困难。我建议您改为以编程方式深入研究最深层的育儿,处理数据并向外工作。 Google 中可能有关于如何执行此操作的在线示例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-03
        • 2023-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-08
        相关资源
        最近更新 更多