算术表达式评估
堆栈组织在评估算术表达式时非常有效。表达式通常以所谓的中缀表示法表示,其中每个运算符都写在两个操作数之间(即 A + B)。使用这种表示法,我们必须通过使用括号或某些运算符优先级约定来区分 ( A + B )*C 和 A + ( B * C )。因此,算术表达式中运算运算符和操作数的顺序并不能唯一地确定要执行的操作的顺序。
1.波兰表示法(前缀表示法)——
它指的是运算符放在其两个操作数之前的符号。这里不需要括号,即
+AB
2.反向波兰表示法(后缀表示法)-
它指的是类似的符号,其中运算符放在其两个操作数之后。同样,逆波兰表示法中不需要括号,即
AB+
堆栈组织的计算机比传统的中缀表示法更适合后缀表示法。因此,必须将中缀表示法转换为后缀表示法。从中缀表示法到后缀表示法的转换必须考虑操作层次。
5 个二元运算符有 3 个优先级,如下所示:
Highest: Exponentiation (^)
Next highest: Multiplication (*) and division (/)
Lowest: Addition (+) and Subtraction (-)
例如 -
Infix notation: (A-B)*[C/(D+E)+F]
Post-fix notation: AB- CDE +/F +*
在这里,我们首先在括号 (AB) 和 (D+E) 内执行算术运算。 C/(D+E) 的除法必须在与 F 相加之前完成。然后将括号和括号内的两项相乘。
现在我们需要使用堆栈来计算这些算术运算的值。
获得结果的过程是:
- 以逆波兰表示法(后缀表示法)转换表达式。
- 将操作数按它们出现的顺序压入堆栈。
- 当遇到任何运算符时,弹出两个最上面的操作数以执行操作。
- 执行后将获得的结果压入堆栈。
- 表达式执行完毕后,最终结果仍保留在栈顶。
例如 -
Infix notation: (2+4) * (4+6)
Post-fix notation: 2 4 + 4 6 + *
Result: 60
此表达式求值的堆栈操作如下所示: