2015-03-30 1 views
6

У меня есть выражение, как показано ниже. MIN (MAX (AVG (AVG (4,2), 2,3), SUM (1,2))) Я реализовал алгоритм маневрового двора, чтобы преобразовать инфикс в обратную полировку. Я добавляю функции MAX, MIN и AVG с двумя аргументами. Но предположим, что если я хочу реализовать переменные аргументы, тогда я должен знать, сколько аргументов у каждой функции было в инфиксном выражении. Может ли кто-нибудь сказать мне, как я могу изменить алгоритм маневрового двора, чтобы включить его. аргументов каждой функции при преобразовании инфикса в rpn?Как подсчитать количество аргументов метода при преобразовании выражения инфикса в обратную нотную пометку

ответ

2

Вот как я, наконец, сделал. Когда токен является открытой скобкой, я добавляю его в очередь вывода. Затем, когда вы конвертируете или выполняете вывод RPN, и я сталкиваюсь с токеном вызова функции, я поп-элементы из стека, пока не столкнувшись с открытой скобкой, не отбросьте его и не рассмотрим все между ними как аргумент функции.

Вероятно, не изящное решение, но работал как шарм :)

5

Так что если у вас есть 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. Вам нужно отслеживать счетчик для самого верхнего токена функции в вашем стеке, но также и для всех других токенов функции в вашем стеке, так как вы можете в конечном итоге возобновить эти подсчеты.

0

Слегка аккуратнее решением будет сделать еще один стек. Нажмите текущую позицию токена на этот стек при обнаружении открытой скобки. Затем, когда найдена замкнутая скобка, выскочите первое значение и используйте разницу между текущей позицией токена, чтобы найти общее количество аргументов между скобками. Если оператор является функцией, вы можете использовать это значение или иначе отказаться от него.