#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. Он использует
~
для обозначения унарного минуса, а не дополнения. Прочитайте вопрос. И не отвечайте дважды.