我正在寻找算法后缀中缀符号,这将产生最小数量的括号。
我发现,但它会产生很多很多括号:http://tajendrasengar.blogspot.com/2011/09/postfix-to-infix-algorithm.html
- 例如**
输入:
<ONP>abcd*/+~
结果是:
<INF>~(a+b/(c*d))
我正在寻找算法后缀中缀符号,这将产生最小数量的括号。
我发现,但它会产生很多很多括号:http://tajendrasengar.blogspot.com/2011/09/postfix-to-infix-algorithm.html
输入:
<ONP>abcd*/+~
结果是:
<INF>~(a+b/(c*d))
3条答案
按热度按时间ma8fv8wu1#
如果你真的想要尽可能少的括号,你需要做的事情和你链接到的算法是类似的。
Stack
中的每个 * 复合 * 操作数存储一个运算符。也就是说,操作数中使用的最后一个运算符。可以为此使用第二个Stack
。如果操作数不是复合操作数,则可以将null
与第二个Stack
相加,因为没有运算符。String
,这在算法的其他地方完成(见下文)。当您从每个
Stack
弹出前两个值时,您手头有3个运算符:根据这三个运算符,在组合第一个和/或第二个操作数之前,应该用括号将它们封装起来。
可以使用运算符优先级来确定是否应该使用括号。顺序如下:
(none), {"*", "/"}, {"+", "-"}
"/"
或"-"
,则第二个操作数需要括号。剩下的应该按照你的算法描述的方式来做。
z9ju0rcb2#
我找到了一个例子来解决这个问题,在python的ast库中有一个_Unparsing类来反解析AST树。
库中有一个require_parens函数用于检查圆括号。
示例:
如果需要,可以使用ast.walk函数将AST树转换为后缀表示法。Link
dwbf0jvd3#
实现方法如下:
}
下面是单元测试