Ban*_*aal 7 algorithm shunting-yard polish-notation
我有一个如下表达式.MIN(MAX(AVG(AVG(4,2),2,3),SUM(1,2)))我已经实现了分流码算法,将中缀转换为反向波兰符号.我用两个参数添加函数MAX,MIN和AVG.但是假设我想要实现变量参数,那么我必须知道每个函数在中缀表达式中有多少个参数.有人能告诉我如何修改分流码算法以包含否.将中缀转换为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
Run Code Online (Sandbox Code Playgroud)
问题是你不知道有多少参数属于max多少log(对数可能会也可能不会将基数作为参数).
使用维基百科描述,应该可以计算每个函数参数分隔符(逗号):如果你有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)
Run Code Online (Sandbox Code Playgroud)
你有一个max令牌,另一个用于该log功能.您需要跟踪堆栈中最顶层函数标记的计数,以及堆栈中所有其他函数标记的计数,因为您最终可能会恢复这些计数.
我最终就是这样做的。当标记是左括号时,我将其添加到输出队列中。然后,当转换或执行 RPN 输出时,如果遇到函数调用标记,我会从堆栈中弹出项目,直到遇到左括号,将其丢弃,并将其间的所有内容视为函数的参数。
可能不是一个巧妙的解决方案,但效果很好:)