📅  最后修改于: 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编程语言的实现,请单击此处。