数据结构 - 表示法

编写算术表达式的方法称为表示法.算术表达式可以用三种不同但等同的符号书写,即,不改变表达式的本质或输出.这些符号为 :

  • 中缀符号

  • 前缀(波兰语)符号

  • 后缀(反向波兰语)符号

这些符号的命名方式是它们如何在表达式中使用运算符.我们将在本章中学到相同内容.

中缀表示法

我们用中缀表示法写表达式,例如: a  -  b +  c,在操作数之间 in 中使用运算符.我们人类很容易用中缀符号进行读,写和说话,但同样适用于计算设备.处理中缀表示法的算法在时间和空间消耗方面可能既困难又昂贵.

前缀表示法

在此表示法中,运算符为前缀 ed到操作数,即操作符在操作数之前写入.例如, +  ab .这相当于其中缀符号 a +  B'/B>.前缀表示法也称为波兰表示法.

后缀表示法

此表示法样式称为已撤消波兰表示法.在这种表示法样式中,运算符后缀编辑到操作数,即操作符在操作数之后写入.例如, ab +  .这相当于其中缀符号 a +  b .

下表简要介绍了所有三种符号的差异;

Sr.No.中缀符号前缀符号Postfix Notation
1a +  b+  abab +
2(a +  b)∗ c∗ &加; a b ca b +  c∗
3a∗ (b +  c)∗一个好处; b ca b c +  ∗
4a/b +  c/d+ /ab/cdab/cd/ +
5(a +  b)∗ (c +  d)∗ &加; a b +  c da b +  c d +  ∗
6((a +  b)∗ c ) -  d- ∗ &加; a b c da b +  c∗ d  -

解析表达式

正如我们所讨论的那样,它不是设计解析中缀表示法的算法或程序的一种非常有效的方法.相反,这些中缀符号首先转换为后缀或前缀表示法然后计算.

要解析任何算术表达式,我们还需要处理运算符优先级和关联性.

优先顺序

当操作数位于两个不同的运算符之间时,哪个运算符将首先取操作数,这取决于运算符优先于其他运算符的优先级.例如 :

运算符优先级

因为乘法运算优先于另外,首先评估b * c.稍后提供运算符优先级表.

关联性

关联性描述了具有相同优先级的运算符出现在表达式中的规则.例如,在表达式a +  b  -  c,两者兼而有之; - 具有相同的优先级,然后首先评估表达式的哪个部分,由这些运算符的关联性决定.在这里,两个&加;和 - 是左关联的,因此表达式将被评估为(a +  b) -  c .

优先级和关联性决定了评估的顺序表达.以下是运算符优先级和关联表(从最高到最低);

Sr.No.运算符Precedence相关性
1Exponentiation ^最高右关联
2乘法(∗)&分部(/)第二高左关联
3加法( + )&减法( : )最低左关联

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

a +  b * c ,首先评估表达式部分 b * c ,乘法优先于加法.我们这里使用括号 a +  b 首先进行评估,例如(a +  b)* c .

后缀评估算法

我们现在看一下如何评估后缀表示法的算法 :

 
步骤1  - 从左到右扫描表达式
步骤2  - 如果是操作数,则将其推送到堆栈
步骤3  - 如果它是来自堆栈的操作员拉操作数并执行操作
步骤4  - 将步骤3的输出存储回堆栈
步骤5  - 扫描表达式直到消耗掉所有操作数
步骤6  - 弹出堆栈并执行操作

查看实现在C编程语言中