数据结构&算法 表达式解析
-
表达式解析
编写算术表达式的方法称为符号。算术表达式可以用三种不同但等效的符号表示,即,无需更改表达式的本质或输出。这些符号是-- 中缀表示
- 前缀(波兰语)表示法
- 后缀(反向波兰语)表示法
这些符号被命名为它们如何在表达式中使用运算符。在本章中,我们将学习相同的内容。 -
中缀符号
我们用中缀表示法编写表达式,例如a -b + c,其中运算符在操作数之间使用。对我们人类来说,用中缀符号读、写和说很容易,但对计算设备来说就不那么容易了。处理中缀表示法的算法在时间和空间消耗方面可能是困难和昂贵的。 -
前缀表示法
这种表示法样式称为反向波兰表示法。在这种表示方式中,将运算符后缀到操作数上,即,将运算符写在操作数之后。例如,ab + 。这等效于其后缀符号a + b。 -
后缀表示法
在这种表示法中,运算符被前缀为操作数,即运算符被写在操作数之前。例如,+ ab。这等效于其后缀符号a + b。前缀符号也称为波兰符号。下表简要尝试显示所有三种表示法的区别-中缀 前缀 后缀 a + b + a b a b + (a + b) ∗ c ∗ + a b c a b + c ∗ a ∗ (b + c) ∗ a + b c a b c + ∗ a / b + c / d + / a b / c d a b / c d / + (a + b) ∗ (c + d) ∗ + a b + c d a b + c d + ∗ ((a + b) ∗ c) - d - ∗ + a b c d a b + c ∗ d - -
解析表达式
正如我们已经讨论的那样,这不是一种设计算法或程序来解析中缀符号的非常有效的方法。而是将这些中缀表示法首先转换为后缀或前缀表示法,然后进行计算。要解析任何算术表达式,我们还需要注意运算符的优先级和关联性。优先顺序当一个操作数位于两个不同的运算符之间时,哪个运算符将最先采用该操作数,取决于一个运算符的优先级。例如-由于乘法运算优先于加法运算,因此将首先评估b * c。稍后提供运算符优先级表。关联性关联性描述了规则,其中具有相同优先级的运算符出现在表达式中。例如,在表达式a + b - c中,+和–都具有相同的优先级,然后表达式的哪一部分将首先被求值,取决于这些算符的关联性。在这里,+和-都保持关联,因此表达式将被评估为(a + b)-c。优先级和关联性确定表达式的求值顺序。以下是运算符优先级和关联性表(从最高到最低)-操作符 优先级 关联性 求幂^ 最高 右联想 乘法(∗)和除法(/) 第二高 左联想 加法(+)和减法(-) 最低 左联想 上表显示了运算符的默认行为。在表达式评估的任何时间点,都可以使用括号来更改顺序。例如- 在a + b * c中,将首先对表达式部分b * c进行求值,并将乘法优先于加法。我们在这里使用括号将a + b首先评估,例如(a + b)* c。 -
后缀评估算法
现在,我们将研究有关如何评估后缀表示法的算法-在C中实现-前缀表示法更易于人类阅读和理解,而对于诸如计算机这样的电子机器,后缀是可解析的最佳表达形式。我们将在这里看到一个程序,用于将中缀符号转换并评估为后缀符号-如果我们编译并运行上述程序,它将产生以下结果-