📜  数据结构-表达式解析

📅  最后修改于: 2021-01-11 06:44:24             🧑  作者: Mango


编写算术表达式的方法称为符号。算术表达式可以用三种不同但等效的符号表示,即,无需更改表达式的本质或输出。这些符号是-

  • 中缀符号
  • 前缀(波兰语)表示法
  • 后缀(反向波兰语)表示法

这些符号被命名为它们如何在表达式中使用运算符。在本章中,我们将学习相同的内容。

中缀符号

我们用中符号表示表达式,例如a-b+ c,其中运算符-between操作数使用。对于人类来说,以中缀符号进行阅读,书写和说话很容易,但是在计算设备上却不能很好地兼容。就时间和空间消耗而言,用于处理中缀符号的算法可能是困难且昂贵的。

前缀表示法

在这种表示法中,运算符被前缀为操作数,即运算符被写在操作数之前。例如, + ab 。这等效于其后缀符号&plus ;。 b 。前缀符号也称为波兰符号

后缀符号

这种表示法样式称为反向波兰表示法。在这种表示方式中,运算符被后缀到操作数上,即,运算符被写在操作数之后。例如, ab+ 。这等效于其后缀符号&plus ;。 b

下表简要尝试显示所有三种表示法的区别-

Sr.No. Infix Notation Prefix Notation Postfix Notation
1 a + b + a b a b +
2 (a + b) ∗ c ∗ + a b c a b + c ∗
3 a ∗ (b + c) ∗ a + b c a b c + ∗
4 a / b + c / d + / a b / c d a b / c d / +
5 (a + b) ∗ (c + d) ∗ + a b + c d a b + c d + ∗
6 ((a + b) ∗ c) – d – ∗ + a b c d a b + c ∗ d –

解析表达式

正如我们已经讨论的那样,这不是一种设计算法或程序来解析中缀符号的非常有效的方法。而是将这些infix表示法首先转换为postfix或前缀表示法,然后进行计算。

要解析任何算术表达式,我们还需要注意运算符的优先级和关联性。

优先顺序

当一个操作数位于两个不同的运算符之间时,哪个运算符将最先采用该操作数,取决于一个运算符的优先级。例如-

操作员的优势

由于乘法运算优先于加法运算,因此将首先评估b * c。稍后提供运算符优先级表。

关联性

关联性描述了规则,其中具有相同优先级的运算符出现在表达式中。例如,表达式中的+ b − c,都为+和–具有相同的优先级,则表达式的哪一部分将首先被评估,由这些运算符的关联性决定。在这里,+和-保持关联,因此表达式将被评估为(a+ b)-c

优先级和关联性确定表达式的求值顺序。以下是运算符优先级和关联性表(从最高到最低)-

Sr.No. Operator Precedence Associativity
1 Exponentiation ^ Highest Right Associative
2 Multiplication ( ∗ ) & Division ( / ) Second Highest Left Associative
3 Addition ( + ) & Subtraction ( − ) Lowest Left Associative

上表显示了运算符的默认行为。在表达式评估的任何时间点,都可以使用括号来更改顺序。例如-

+中b * c ,将首先对表达式部分b * c求值,并将乘法优先于加法。我们在此处对+使用括号首先要评估的b ,例如(a+ b)* c

后缀评估算法

现在,我们将研究有关如何评估后缀表示法的算法-

Step 1 − scan the expression from left to right 
Step 2 − if it is an operand push it to stack 
Step 3 − if it is an operator pull operand from stack and perform operation 
Step 4 − store the output of step 3, back to stack 
Step 5 − scan the expression until all operands are consumed 
Step 6 − pop the stack and perform operation

要查看C编程语言的实现,请单击此处