在将中缀表达式转换为反向修饰符号时如何计算方法的参数数量

问题描述 投票:8回答:3

我有一个如下表达式。MIN(最大(AVG(AVG(4,2),2,3),SUM(1,2)))我已经实现了调车场算法,将中缀转换为反向波兰语表示法。我添加了带有两个参数的函数MAX,MIN和AVG。但是假设我要实现可变参数,那么我必须知道每个函数在中缀表达式中有多少个参数。有人可以告诉我如何修改调车场算法以不包括在内。将中缀转换为rpn时每个函数的参数的集合?

algorithm shunting-yard polish-notation
3个回答
7
投票

因此,如果您有log max(1, 2, 3, 4, 5),您会这样做:

log => push log 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功能有另一个计数。您需要跟踪堆栈中最顶层的函数令牌的计数,也需要跟踪堆栈中所有其他函数令牌的计数,因为您最终可能会恢复这些计数。


2
投票

这是我最终的做法。当令牌是一个开放的括号时,我将其添加到输出队列中。然后,当转换或执行RPN输出时,我遇到一个函数调用令牌,我从堆栈中弹出项目,直到遇到一个开放的括号,将其丢弃,并将这两者之间的所有内容都视为该函数的参数。

可能不是一个很好的解决方案,但像一个魅力:)


0
投票

稍微整洁的解决方案是制作另一个堆栈。在找到开括号时将当前令牌位置推入此堆栈。然后,在找到一个封闭的括号时,弹出第一个值,并使用当前标记位置之间的差来查找括号之间的参数总数。如果运算符是一个函数,则可以使用该值,否则可以将其丢弃。

© www.soinside.com 2019 - 2024. All rights reserved.