Как разобрать математические выражения в скобках - PullRequest
9 голосов
/ 04 июня 2010

Это не школьное задание или что-то еще, но я понимаю, что это в основном академический вопрос. Но я изо всех сил пытался разобрать «математический» текст и найти ответ.

Например - я могу понять, как анализировать '5 + 5' или '3 * 5' - но у меня не получается, когда я пытаюсь правильно объединить операции в цепочку.

(5 + 5) * 3

В основном меня просто беспокоит то, что я не могу понять это. Если кто-нибудь может указать мне направление, я бы очень признателен.

EDIT Спасибо за все быстрые ответы. Извините, я не справился лучше.

Во-первых, я не использую регулярные выражения. Я также знаю, что уже есть доступные библиотеки, которые будут принимать в виде строки математическое выражение и возвращать правильное значение. Итак, я в основном смотрю на это, потому что, к сожалению, я не "понимаю".

Второе. То, что я пытался сделать (возможно, неправильно), но сначала я считал «(» и «)» и оценивал самые глубокие предметы. В простых примерах это сработало; но мой код не красивый и более сложные вещи вылетает. Когда я «вычислил» самый низкий уровень, я модифицировал строку.

Итак ... (5 + 5) * 3

Превратится в 10 * 3

Который затем оценил бы 30

Но это было просто «неправильно».

Надеюсь, это поможет прояснить ситуацию. Я обязательно проверю предоставленные ссылки.

Ответы [ 12 ]

1 голос
/ 04 июня 2010

Я сделал нечто похожее на то, что вы описываете. Я использую рекурсию, чтобы разобрать все скобки. Затем я использую троичное дерево для представления различных сегментов. Левая ветвь - это левая сторона оператора. Центром филиала является оператор. Правая ветвь - это правая часть оператора.

Короткий ответ Рекурсия и тройные деревья.

1 голос
/ 04 июня 2010

По сути, вы спрашиваете нас, как написать «парсер». Вот еще один вопрос переполнения стека о парсерах: ручное кодирование парсера

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...