У меня есть выражение, как показано ниже. MIN (MAX (AVG (AVG (4,2), 2,3), SUM (1,2))) Я реализовал алгоритм маневрового двора, чтобы преобразовать инфикс в обратную полировку. Я добавляю функции MAX, MIN и AVG с двумя аргументами. Но предположим, что если я хочу реализовать переменные аргументы, тогда я должен знать, сколько аргументов у каждой функции было в инфиксном выражении. Может ли кто-нибудь сказать мне, как я могу изменить алгоритм маневрового двора, чтобы включить его. аргументов каждой функции при преобразовании инфикса в rpn?Как подсчитать количество аргументов метода при преобразовании выражения инфикса в обратную нотную пометку
ответ
Вот как я, наконец, сделал. Когда токен является открытой скобкой, я добавляю его в очередь вывода. Затем, когда вы конвертируете или выполняете вывод RPN, и я сталкиваюсь с токеном вызова функции, я поп-элементы из стека, пока не столкнувшись с открытой скобкой, не отбросьте его и не рассмотрим все между ними как аргумент функции.
Вероятно, не изящное решение, но работал как шарм :)
Так что если у вас есть log max(1, 2, 3, 4, 5)
вы будете делать:
log => push sin to stack
max => push max to stack
(=> push (to stack
1 => push 1 to stack
, => pop top of stack to output => pop 1 to output
2 => push 2 to stack
, => pop 2 to output
...
=> end result: 1 2 3 4 5 max log
Проблема заключается в том, что вы не знаете, сколько аргументов принадлежат max
и сколько log
(логарифм может или не может взять базу как аргумент).
Использование wikipedia description, должна быть возможность рассчитывать каждый аргумент функции разделитель (запятая): если у вас есть k
функцию разделителей, то у вас есть k + 1
аргументы, так что вы могли бы выводить 1 2 3 4 5 max_5 log
выше. Будьте осторожны, чтобы иметь различные счетчики в случае вложенных функций:
max(1, 2, log(3, 4), 5) => 1 2 3 4 log_2 5 max_4
---------
max has 4 arguments after evaluating log_2(3, 4)
Вы бы один счетчик для max
маркер, а другой для функции log
. Вам нужно отслеживать счетчик для самого верхнего токена функции в вашем стеке, но также и для всех других токенов функции в вашем стеке, так как вы можете в конечном итоге возобновить эти подсчеты.
Слегка аккуратнее решением будет сделать еще один стек. Нажмите текущую позицию токена на этот стек при обнаружении открытой скобки. Затем, когда найдена замкнутая скобка, выскочите первое значение и используйте разницу между текущей позицией токена, чтобы найти общее количество аргументов между скобками. Если оператор является функцией, вы можете использовать это значение или иначе отказаться от него.