【问题标题】:how do I add unary operator for RPN algorithm that calculates postfix expression in java如何为在java中计算后缀表达式的RPN算法添加一元运算符
【发布时间】:2019-08-02 07:00:58
【问题描述】:

我必须创建一个计算后缀表达式的应用程序。我可以在网上找到它(rosetta code),但它缺少一元运算符。符号“~”应该表示我尝试添加它的一元运算符,但不幸的是它不起作用。请指教;

else if(token.equals("~")){
            System.out.print("Operate\t\t");
            double firstOperand = stack.pop();
            stack.push(firstOperand * -1);
}else

【问题讨论】:

  • “没用”应该得到像“纠正它”这样的答案。更多信息可能会有所帮助。无论如何:double 的否定只是-firstOperand,不需要使用任何数学方法。顺便说一句,您为什么要从堆栈中获取 两个 值,只需要一个。
  • 如果您尝试使用相同的符号 ('-') 进行二元减法和一元否定,则会产生内在歧义。
  • 嘿卡洛斯,就像戴夫说的我必须做出区分。反向波兰表示法也相当混乱,但你的意思是像这样写“stack.push(firstOperand * -1);”
  • 我刚刚编辑了它,我相信它可以工作,但老实说我不知道​​后缀是 (7 5 3 - - ~~~),我得到的最终答案是 -5。跨度>
  • 3-5 = -2, -7 = -9,三个符号反转 = +9。所以你的减法代码已经有问题了。请注意,操作数以错误的顺序从堆栈中取出,如中缀所示。

标签: java unary-operator rpn


【解决方案1】:

rosetta code 中的上述更改不会停止

evalRPN( "~3 ~4 ~2 * ~1 ~5 - ~2 ~3 ^ ^ / +" );

给予

Input   Operation   Stack after
~3  Push        [-4.0]
~4  Push        [-5.0, -4.0]
~2  Push        [-3.0, -5.0, -4.0]
*   Operate     [15.0, -4.0]
~1  Push        [-2.0, 15.0, -4.0]
~5  Push        [-6.0, -2.0, 15.0, -4.0]
-   Operate     [4.0, 15.0, -4.0]
~2  Push        [-3.0, 4.0, 15.0, -4.0]
~3  Push        [-4.0, -3.0, 4.0, 15.0, -4.0]
^   Operate     [0.012345679012345678, 4.0, 15.0, -4.0]
^   Operate     [1.017262041564032, 15.0, -4.0]
/   Operate     [14.745463201337605, -4.0]
+   Operate     [10.745463201337605]
Final answer: 10.745463201337605

7th中的结果相同

ok> 3 not 4 not 2 not * 1 not 5 not - 2 not 3 not y^x y^x / +
ok> .s
› 10,7454632
——

【讨论】:

【解决方案2】:

对于双精度值,一元 ~ 未定义。所以不建议通过以下方式支持运营商:

  …
  try {
    tokenNum = Double.parseDouble( token );
  }
  catch( NumberFormatException e ) {
    if( token.startsWith( "~" ) ) {
      tokenNum = (double) ~ Integer.parseInt( token.substring( 1 ) );
      token = tokenNum.toString();
    }
  }
  …

  return( expr.replaceAll( "[^\\^\\*\\~\\+\\-\\d/\\s]", "" ) );  // cleanExpr

因此,RPN 语言 7th 不支持一元 ~。你必须打电话给例如。 2 not 代替 ~2

【讨论】:

  • 我尝试使用您的解决方案,但它一到达一元运算符就停止了 ~。
  • 他使用~ 表示一元减号,而不是补码。阅读问题。并且不要回答两次。
猜你喜欢
  • 1970-01-01
  • 2013-10-18
  • 2022-11-18
  • 2020-06-23
  • 2014-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多