Это теоретическое:
Мне нужно вычислить выражение, которое я уже преобразовал из infix в postfix. Постфикс сохраняется внутри Queue
, так как я хотел избежать работы с String
. Таким образом, я знаю, где находятся различия между числами, и я могу получить к ним доступ в «правильном» порядке.
Это выглядит так:
// Original expression: 2+(3+1)-(5-3)^2*3-1
Queue: [2.0, 3.0, 1.0, +, +, 5.0, 3.0, -, 2.0, ^, 3.0, *, -,1.0, -]
Теперь я подумал, используя два стека:
- исходный стек (который был предварительно заполнен содержимым очереди)
- и целевой стек
передавая постфиксное выражение от одного к другому, одновременно спрашивая, является ли текущий элемент числом или оператором, и подсчитывая последовательные числа.
Если я доберусь до оператора, и число будет не менее 2, я выполню операцию и положу ее в стек назначения. Достигнув конца исходного стека (теперь пустого), я передал бы все обратно в него и начал бы все сначала, пока не остался бы только результат.
Я спрашиваю себя сейчас:
- Это хороший подход или лучше попытаться обнаружить все шаблоны типа
NumberNumberOperator
и обработать их за один раз? - И если второй вариант подходит, как это можно сделать?