前缀表达式、中缀表达式、后缀表达式转换计算(数据结构)

发布于:2025-05-10 ⋅ 阅读:(5) ⋅ 点赞:(0)

一、前缀表达式、中缀表达式、后缀表达式 是什么

 (一)前缀表达式(Infix Notation)
  • 定义:运算符位于两个操作数之间,是人类最常用的表达式形式。

  • 示例A + B、(3 * 4) + 5

  • 特点:直观易读,但需括号处理优先级。
    计算机直接解析较复杂(需考虑运算符优先级和括号)。

 (二)中缀表达式(Prefix Notation,又称波兰表达式)
  • 定义:运算符位于所有操作数之前。

  • 示例+ A B(等价于中缀的 A + B)            + * 3 4 5(等价于 (3 * 4) + 5)

  • 特点:无需括号,通过运算符顺序和操作数数量即可确定运算顺序。
    适合计算机栈操作(从右向左扫描)。

 (三)后缀表达式(Postfix Notation,又称逆波兰表达式)
  • 定义:运算符位于所有操作数之后。

  • 示例A B +(等价于 A + B)        3 4 * 5 +(等价于 3 * 4 + 5)

  • 特点:无需括号,从左向右扫描即可计算(遇到运算符时,其前两个操作数必已就绪)。
    计算机处理效率高,常用于栈式计算器(如早期HP计算器)。

 (四)转换示例
  • 中缀(A + B) * C
  • 前缀: * + A B C
  • 后缀 A B + C *
 (五)关键区别
类型 运算符位置 括号需求 计算方向 典型应用场景
中缀 操作数之间 需要 需优先级规则 人类书写
前缀 操作数前 不需要 从右向左 Lisp语言、编译器
后缀 操作数后 不需要 从左向右 栈式计算、虚拟机

二、如何计算前、中、后缀表达式

前缀表达式、中缀表达式、后缀表达式,是通过树来存储和计算表达式的三种不同方式

以如下公式为例

( a + b − c ) ) ∗ d

通过树来存储该公式,可以表示为

问题就来了,树只是一种抽象的数据结构,它必须要通过某个形式的文本来才能存储和输入

此时,就有了三种表示方法:前缀表达式、中缀表达式、后缀表达式

它们分别相当于树的前序遍历、中序遍历、后序遍历,前中后指的是遍历时运算符的遍历顺序

前序遍历(前缀表达式):运算符 + 左操作数 + 右操作数

中序遍历(中缀表达式)左操作数 + 运算符 + 右操作数

后序遍历(后缀表达式)左操作数 + 右操作数 + 运算符

(一)前缀表达式

运算符 + 左操作数 + 右操作数
上面的公式,先序遍历的结果为

∗ + a − b c d

这种表达方式是没有歧义的,可以直接作为前缀表达式的结果,这种表达方式,符合计算机的处理习惯,程序可以很容易地解析这种表达式

(二)中缀表达式

左操作数 + 运算符 + 右操作数
上面的公式,中序遍历的结果为:

a + b − c ∗ d

显然,这种表达方式是有歧义的,比如ab是一颗子树,cd是一颗子树,最后相减,遍历结果和上面是一样的。所以中缀表达式必须借助括号,才能正确地表达出想要的结果。中缀表达式的表示结果为:

( a + ( b − c ) ) ∗ d

这种表达方式,符合人类的阅读习惯

(三)后缀表达式

左操作数 + 右操作数 + 运算符
上面的公式,后序遍历的结果为:

a b c − + d ∗

这种表达方式,也符合计算机的处理习惯,解析也很简单。相对于前缀表达式来说,后缀表达式的符号读取顺序,和人类阅读习惯是一致的。因此实际计算机程序中,基本都是用后缀表达式来存储公式的,前缀表达式效果次之。对于中缀表达式,我们则可以先将其转为后缀表达式,再进行求值。

三、例题

(选择题) 算术表达式b*(a+c)-d的后缀表达式是( )。

A. ba+cd*-          B. bacd+*-          C. ba*c+d*-          D. bac+*d-

正确答案:D

本题考查后缀式:左操作数 + 右操作数 + 运算符

所以结果为:  bac+*d-


网站公告

今日签到

点亮在社区的每一天
去签到