Как добавить унарный оператор для алгоритма RPN, который вычисляет постфиксное выражение в Java - PullRequest
0 голосов
/ 12 марта 2019

Мне нужно создать приложение, которое вычисляет выражения постфикса. Мне удалось найти его в Интернете ( код розетки ), но в нем отсутствует унарный оператор. символ «~» должен обозначать унарный оператор, который я пытался добавить, но, к сожалению, он не сработал. Пожалуйста, сообщите;

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

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

Ничто не останавливается с вышеупомянутыми изменениями в коде розетки

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

тот же результат, что и в 7-м

ok> 3 not 4 not 2 not * 1 not 5 not - 2 not 3 not y^x y^x / +
ok> .s
› 10,7454632
——
0 голосов
/ 12 марта 2019

Унарный ~ не определен для двойных значений.Поэтому не рекомендуется поддерживать оператора следующим образом:

  …
  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 7 не поддерживает унарный ~.Вы должны позвонить, например.2 not вместо ~2.

...