如何在将中缀表达式转换为反向抛光表示法时计算方法的参数数量

时间:2015-03-30 14:02:59

标签: algorithm shunting-yard polish-notation

我有一个如下表达式。 MIN(MAX(AVG(AVG(4,2),2,3),SUM(1,2))) 我已经实现了分流码算法将中缀转换为反向波兰表示法。 我用两个参数添加函数MAX,MIN和AVG。但是假设我想实现变量参数,那么我必须知道每个函数在中缀表达式中有多少个参数。 有人能告诉我如何修改分流码算法以包含否。将中缀转换为rpn时每个函数的参数?

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

这就是我最终的表现。 当令牌是一个开括号时,我将它添加到输出队列。 然后,当转换或执行RPN输出时,我遇到一个函数调用令牌,我从堆栈弹出项目,直到我遇到一个打开的括号,丢弃它,并考虑其间的所有内容作为函数的参数。

可能不是一个简洁的解决方案,而是像魅力一样工作:)

答案 2 :(得分:0)

一个稍微简洁的解决方案是制作另一个堆栈。将此堆栈的当前令牌位置推送到找到一个打开的括号。然后,当找到一个闭括号时,弹出第一个值并使用当前令牌位置之间的差异来查找括号之间的参数总数。如果操作符是函数,则可以使用该值,或以其他方式将其丢弃。