как мне добавить унарный оператор для алгоритма RPN, который вычисляет постфиксное выражение в java

#java #unary-operator #rpn

#java #унарный оператор #rpn

Вопрос:

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

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

Комментарии:

1. «не сработало» заслуживает ответа типа «исправьте это». Немного больше информации могло бы помочь. В любом случае: negate для double было бы просто -firstOperand , не нужно использовать какой-либо математический метод. Кстати, почему вы получаете два значения из стека, нужно только одно.

2. Вы создадите внутреннюю двусмысленность, если попытаетесь использовать один и тот же символ (‘-‘) для двоичного вычитания и унарного отрицания.

3. Эй, Карлос, как сказал Дейв, я должен провести различие. Также обратная польская нотация довольно запутанна, но то, что вы говорите, это написать это так «stack.push(firstOperand * -1);»

4. Я только что отредактировал его, и я верю, что он работает, но я, честно говоря, не знаю, что такое постфикс (7 5 3 — — ~~~) и окончательный ответ, который я получаю, равен -5.

5. 3-5 = -2, -7 = -9, с тремя переворотами знака = 9. Итак, что-то уже не так с вашим кодом вычитания. Обратите внимание, что операнды выводятся из стека в неправильном порядке для вычитания и деления, как написано в infix.

Ответ №1:

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

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
  

По этой причине 7-й язык RPN не поддерживает унарный ~ . Вы должны вызвать, например. 2 not вместо ~2 .

Комментарии:

1. Я пытался использовать ваше решение, но оно останавливается, как только доходит до унарного оператора ~.

2. Он использует ~ для обозначения унарного минуса, а не дополнения. Прочитайте вопрос. И не отвечайте дважды.

Ответ №2:

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

 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
——
  

Комментарии:

1. Он использует ~ для обозначения унарного минуса, а не дополнения. Прочитайте вопрос. И не отвечайте дважды.

2. «унарный минус» — это название символа в *-a*