我目前有一个标记中缀表达式的函数。
但是,我有一个小问题。
比如我说:
2 ^ -(5 * 5)
这会转换为:
2
^
-1
*
(
5
*
5
)
然而,这不符合我的要求。
我的目标是将它包装在括号中:
2
^
(
-1
*
(
5
*
5
)
)
这将根据我的需要进行评估。
我该怎么做才能获得此输出。基于堆栈的方法很好。
鉴于我有一个如上所示的令牌数组,我怎么能得到一个新的数组,其中包含在括号中的否定?
如果有必要,我可以修改我的代码以生成以下内容而不使用-1 *:
2
^
-
(
5
*
5
)
添加括号的算法是什么,以便正确评估底片?
由于
答案 0 :(得分:1)
您始终可以将其解析为reverse polish notation,然后只评估流。这会给你一个流:
2
-1
5
5
*
*
^
当您从左向右遍历流时,将操作数(2,5等)推入堆栈。遇到运算符(*,^)时,从堆栈中弹出适当数量的操作数,执行操作,然后将结果推送到堆栈。在那时你将拥有堆栈上的价值,这将是结果。
或者,您可以将一元减号视为与常规减号不同的运算符。一元减号的优先级高于常规运算符:
2
5
5
*
unary-
^
答案 1 :(得分:1)
如果你使用的是分流码算法,那就不那么难了。要意识到的第一件事是你正在处理两个不同的运算符,它们都使用' - '符号。一个是“减法”运算符,另一个是“否定”运算符。
诀窍是如何区分它们。当您看到“ - ”时,请查看上一个符号。如果它为null(' - '在字符串的开头),一个运算符或一个左括号,那么它就是否定运算符。否则它会减去。
每个操作员都有一个优先级和关联性,为了实现分流码,你必须提前知道。减法运算符的优先级低于乘法和除法,并且是左关联的。否定的优先级在乘法和指数之间,它是正确的联想。它也只需要1个操作数而不是2个。
所以你的表达在转换后会是:2 5 5 *否定^
好的,很好,但如果“否定”不计算怎么办?没关系,弹出否定并将-1 *推到它的位置。现在你有2 5 5 * -1 * ^。或者,如果您不做负数,请将“ - ”替换为“0 1 - ”,以获得“2 5 5 * 0 1 - * ^”。