web_dev
@web_dev

Наиболее рациональный способ определить отрицательное число в String?

Здравствуйте,
тут ради интереса, для себя пишу вычислитель математического выражения.
И вот интересный момент. Хочется красиво распознавать отрицательное это число или же операнд?
"Брут-форсом" конечно же это решить можно, но хочется как-то красиво, а ничего умного в голову не приходит...

Есть идеи? )) Спасибо.
Например из таких выражений. Определить, это отрицательное число, а не операнд и наоборот, - это операнд, а не отрицательное число.

"1-1"
"1 -1"
"1- 1"
"1 - 1"
"6 + -( -4)"
"6 + -(4)"


и так д.. Со скобками - это не проблема, для этого есть алгоритм специальный, который раскладывает по стекам, операнды и числа.
  • Вопрос задан
  • 290 просмотров
Пригласить эксперта
Ответы на вопрос 3
@mayton2019
Ent. Software engineer. Oracle. SQL. BigData.
Есть хорошая поговорка про пудинг.

Вобщем для расчета значение математического выражения - его надо вычислить. Никакие брутфорсы скорее всего не помогут. Выражение может потребовать расчетов функций. И их надо провести. Как - это уже другой вопрос но ясно что не в строках.
Ответ написан
Bavashi
@Bavashi
Вам надо попробовать сводить все к унифицированному виду. То есть, во-первых, вам надо договориться о регламенте ввода, будет ли это ввод только с пробелами после каждого символа или же нет. Во-вторых, предположим ввод с пробелами после каждого символа, то понятие "отрицательное число" убираем, чтобы добиться унифицированного вида. Убираем его, например, распарсив символьный массив и определив места, где перед операцией вычитание, у которой отсутствует число слева и нет закрывающейся скобки ")" - при этом помним, что у нас может быть только операция вычитание, а не отрицательное число - заменяем на четыре символа "( 0 " включая пробелы. Далее для каждой такой вставки ищем первую закрывающую скобку ")" и сразу за ней вставляем два символа " )", включая пробел. Далее, вычисляем получившееся выражение в "обычном режиме" и не пытаемся вычислить где у нас отрицательное число, потому что все у нас свелось к унифицированному виду и самого понятия как отрицательного числа нет и оно нам не нужно. Также можно вынести это в отдельный метод, который бы сначала приводил строку с математическим выражением к унифицированному виду, а затем используем "обычный" метод, например тот, что вы привели в ссылке. Итого, на ваших примерах будет такая запись, которая корректно отработает по алгоритму из ссылки:

"3 - - ( - 3 )"
"3 - ( 0 - ( ( 0 - 3 ) ) )"

"1 - - ( - ( - ( - 6 ) ) )"
"1 - ( 0 - ( ( 0 - ( ( 0 - ( ( 0 - 6 ) ) ) ) ) ) )"


P.S. В общем, смысл такой, чтобы перед вычислением выражения привести его к понятному для алгоритма виду и тем самым уйти от необходимости определять и находить что есть отрицательное число, а что нет.
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Преобразование из инфиксной нотации(линк)
Для операций вроде −x, являющихся как бинарными, так и унарными, нужна модификация: при обнаружении подобной операции система смотрит на предыдущий символ и определяет, чем будет минус, бинарной операцией или унарной функцией. Соответственно, в стеке и ОПЗ нужны разные символы для бинарного и унарного минуса.


PS: перепостил без говна и сарказма. Можно отмечать решением.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы