首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java计算器,如何处理负数

Java计算器,如何处理负数
EN

Stack Overflow用户
提问于 2014-01-06 19:58:26
回答 3查看 3.9K关注 0票数 1

我正在用Java创建一个计算器,正在努力想出一种处理负数的方法,到目前为止,我可以解析一个表达式,例如:

代码语言:javascript
运行
复制
((4-3)*(4/2))*2

变成:

代码语言:javascript
运行
复制
[4.0, -3.0, +, 4.0, 2.0, /, *, 2.0, *]

然而,我不知道如何处理包含否定的表达式,例如:

代码语言:javascript
运行
复制
2*(-2-3)

到目前为止,我有一个这样的表达式,当遇到负值时,它将前面的数字乘以-1,并在列表的末尾添加一个+,所以表达式变成了这样:

代码语言:javascript
运行
复制
[2.0, -2.0, -3.0, +, +, *]

这在我的程序中导致了很多错误,有没有人能帮我找到一个更好的方法来处理负片。

非常感谢你的帮助

EN

回答 3

Stack Overflow用户

发布于 2014-01-07 01:04:03

Vladp是正确的,但需要补充一些说明。

您正在实现将infix notation转换为postfix notationShunting Yard algorithm,也就是反向波兰符号。

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

所以对于

代码语言:javascript
运行
复制
2*(-2-3)

您可以将其转换为AST,如下所示

代码语言:javascript
运行
复制
       *
      / \
  - (b)  2
    / \
- (u)  3
  /
 2

其中- (b)是二进制减法,- (u)是一元否定。

或RPN as

代码语言:javascript
运行
复制
2-3-2*  

并评估为

代码语言:javascript
运行
复制
2 - 3 - 2 *
(-2) 3 - 2 *
(-5) 2 *
-10 

当你计算一元否定时,只需将一元运算符和next数字从堆栈中取出,并将该数字的负值推入堆栈。一元否定并不意味着负数的倍数,而是将操作数转换为负数。

所以-5被否定就是-5

被否定的5-5

存储负号的值时,必须使用两个不同的运算符,一个用于二进制,另一个用于一元。此外,在计算运算符时,必须对一元运算符和二元运算符使用不同的情况。

票数 2
EN

Stack Overflow用户

发布于 2014-01-06 20:09:38

创建两种不同的-类型,

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

代码语言:javascript
运行
复制
-(2+3)
[2, 3, +, type1-]

第二,它的工作方式类似于+

代码语言:javascript
运行
复制
2-3
[2, 3, type2-]

在一起,你应该得到:

代码语言:javascript
运行
复制
2--3
[2, 3, type1-, type2-]

-2-(-3)
[2, type1-, 3, type1-, type2-]

当您遇到没有参数等待计算的-时,它为type1,否则为type2。

票数 1
EN

Stack Overflow用户

发布于 2014-01-06 23:56:53

好吧,这是我的两点价值:

我怀疑像你所做的那样,把一个包含圆括号、圆括号等的方程式分解成一个数组,会导致很多困难。我建议您改为以编程方式深入到最深的父系,处理数据,然后向外工作。在Google上可能有关于如何做到这一点的在线例子。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20949556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档