在带有' - (内部表达式)'的表达式周围添加括号

时间:2014-02-08 17:13:29

标签: c++ algorithm parsing

我目前有一个标记中缀表达式的函数。

但是,我有一个小问题。

比如我说:

2 ^ -(5 * 5)

这会转换为:

2
^
-1
*
(
5
*
5
)

然而,这不符合我的要求。

我的目标是将它包装在括号中:

2
^
(
-1
*
(
5
*
5
)
)

这将根据我的需要进行评估。

我该怎么做才能获得此输出。基于堆栈的方法很好。

鉴于我有一个如上所示的令牌数组,我怎么能得到一个新的数组,其中包含在括号中的否定?

如果有必要,我可以修改我的代码以生成以下内容而不使用-1 *:

2
^
-
(
5
*
5
)

添加括号的算法是什么,以便正确评估底片?

由于

2 个答案:

答案 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 - * ^”。