![]() |
|
![]() ![]() ![]() |
|
Hidrag |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 877 Регистрация: 9.4.2005 Где: JDK Репутация: нет Всего: 25 |
Задача такая нужно проанализировать выражение и удалить в нем лишние скобки, например:
c=(a+b)+d должно получиться: с=a+b+d то есть нужно убрать скобки которые не влияют на результат. Выражение всегда правильное, то есть не будет такого что есть открывающая скобка и нет закрывающей. Из операций есть только + и * Язык программирования, не важен, главное алгоритм анализа. Я, конечно, буду сам пытаться написать парсер, но почему то кажется что задача обычная и наверняка есть и кто нибудь знает простое решение. С виду кажется вообще просто, но вдруг выражение будет: с=(a*b+c)*d здесь уже скобки должны остаться... -------------------- ![]() |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
в принципе, можно просто пробовать убрать каждую пару скобок и сравнивать выражения на эквивалентность (в данном случае - на порядок выполнения операций)
правда, создаётся ощущение, что это окольный путь... -------------------- qqq |
|||
|
||||
Hidrag |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 877 Регистрация: 9.4.2005 Где: JDK Репутация: нет Всего: 25 |
не так все просто оказывается....
![]() -------------------- ![]() |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
На порядок выполнения - нельзя. Он может измениться. А вот деревья, построенные в обратно-польской нотации, окажутся эквивалентными. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
maxdiver |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 29.1.2008 Где: Саратов Репутация: 16 Всего: 18 |
Нужно построить дерево разбора этого выражения, но так, чтобы в нём остались скобки (как особый элемент с одним дочерним элементом).
Лишними окажутся скобки, дочерние элементу '+', дочерние '-' (но здесь уже в вычитаемом надо поменять знаки), а также скобки, дочерние скобкам. Вроде так все лишние скобки уберутся. Ещё есть идея построить обычное дерево разбора, а потом по нему построить выражение. В результате лишних скобок тоже не должно получаться. |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Но это действие может изменить выражение. A+(B+C) превратится в B+C+A. Без скобок, но не то... -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Serkys |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1061 Регистрация: 19.4.2004 Репутация: нет Всего: 22 |
||||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Поскольку надо не получить конечное выражение, а только найти лишние скобки, с выражением можно делать что угодно - это очевидно. Просто после прямого-обратного преобразований выражение может измениться так, что понять, какие же скобки оказались лишними, тоже станет задачей нетривиальной... -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
если я правильно понял, то, думаю, скобки в данном случае не будут убраны: a*(b*c) -------------------- qqq |
|||
|
||||
HistoryEarth |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 23.8.2007 Репутация: нет Всего: нет |
Вылядит это так, что достаточно искать и убирать конструкции типа ")+" и "+(". Предварительно считая вложенность и пр.
|
|||
|
||||
Hidrag |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 877 Регистрация: 9.4.2005 Где: JDK Репутация: нет Всего: 25 |
Serkys, Допустимы!
Выражения сами по себе не очень сложные, поэтому от перестановки членов выражения ничего не меняется. А что за прямое-обратное преобразование? -------------------- ![]() |
|||
|
||||
Serkys |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1061 Регистрация: 19.4.2004 Репутация: нет Всего: 22 |
||||
|
||||
maxdiver |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 29.1.2008 Где: Саратов Репутация: 16 Всего: 18 |
Да, точно, как раз сейчас хотел об этом написать ![]() Если у скобки дочерним элементом является константа или переменная, то она, разумеется, тоже лишняя. Вот теперь вроде всё ![]() |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 3 Всего: 173 |
Я недавно описывал алгоритм восстановления выражения по дереву с минимально необходимым числом скобок. Когда-то писал на OCaml для простенького интерпретатора.
-------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |