Самый надежный способ решения этой задачи - разобрать выражение на составляющие, построить Абстрактное Синтаксическое Дерево (АСД). АСД представляет собой бинарное дерево, где каждая вершина - это операция, а ее дети - операнды. Операнды могут быть числами или другими выражениями.
Для вывода выражения из АСД вставляются только необходимые скобки. При этом есть определенные правила:
- Если вершина в дереве - "+", то скобки вокруг нее не нужны.
- Если вершина - "*", то ставятся скобки вокруг левого сына, если он содержит операцию "+" или "-". Скобки также ставятся вокруг правого сына, если он не является числом.
- Если вершина - "-", то скобки ставятся справа, если правый сын содержит операцию "+" или "-".
- Если вершина - "/", то скобки ставятся вокруг левого сына, если он содержит операцию "+" или "-". Скобки также ставятся вокруг правого сына, если он не является числом.
Рекурсивная функция эффективно реализует этот алгоритм. Она проверяет, требуется ли вставка скобок вокруг левого сына, и рекурсивно выводит его, затем выводит операцию и правого сына.
Для парсинга строки используются различные алгоритмы. Простейший алгоритм - квадратичный - проходит по строке и находит самую левую операцию с наивысшим приоритетом, не находящуюся внутри скобок (с помощью счетчика открытых скобок). Если такую операцию не найдено, скобки по краям можно опустить. Если скобок нет, то мы имеем дело с числом или переменной. Если операция найдена, рекурсивно разбираются две подстроки слева и справа от нее.