Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >计算机是如何理解表达式的?从中缀到后缀一文搞定!

计算机是如何理解表达式的?从中缀到后缀一文搞定!

原创
作者头像
Eulogy
修改于 2025-04-21 23:44:15
修改于 2025-04-21 23:44:15
1560
举报

表达式

在学习数据结构和算法时,我们常常会接触到表达式的不同写法,它们分别是中缀表达式、前缀表达式和后缀表达式。我们日常最熟悉的表达形式就是中缀表达式,如下所示:

代码语言:java
AI代码解释
复制
5-4\*3/(2+1)

中缀表达式最符合人类的书写和阅读习惯,但对于计算机来说,它却并不友好。于是,为了更高效地进行计算,我们引入了前缀和后缀表达式的表示方式。

一、中缀表达式

中缀表达式是我们平时学习和使用的表达方式,它的特点是:运算符位于两个操作数之间,并且可以通过括号来调整运算优先级。

虽然中缀表达式易于阅读,但它存在如下问题:

  • 运算顺序不明确,依赖运算符优先级与括号;
  • 结构不够线性,计算过程复杂,不适合计算机直接解析。

中缀表达式的计算(借助两个栈)

为了让计算机也能处理中缀表达式,我们可以借助两个栈:

栈1(操作数栈):用于保存操作数;

栈2(运算符栈 :用于保存运算符。

基本步骤如下:

  1. 从左至右遍历表达式;
  2. 遇到操作数,入栈1;
  3. 遇到运算符,比较其优先级:

如果栈2为空,或当前运算符优先级大于栈顶运算符,入栈;

否则弹出栈2顶端运算符,同时从栈1中弹出两个操作数进行运算,将结果压入栈1,然后继续比较;

  1. 遇到左括号直接入栈,遇到右括号则不断弹出栈2并计算,直到遇到左括号;
  2. 遍历结束后,如果栈2不为空,继续弹出并计算,直到栈清空;

最终栈1中的元素即为表达式的计算结果。

流程如下:

二、前缀表达式

前缀表达式又称波兰表达式,其特点是:运算符写在两个操作数的前面,如下所示:

代码语言:java
AI代码解释
复制
-5\*4/3+12

该前缀表达式所对应的中缀表达式是

代码语言:java
AI代码解释
复制
5-4\*3/(2+1)

前缀表达式的优势在于,完全不依赖括号或运算符优先级来确定运算顺序。按照从右往左的顺序遍历,先遇到的运算符先进行运算。

前缀表达式的计算方式(借助栈):

  1. 初始化一个栈 stack;
  2. 从右往左遍历表达式;
  3. 遇到数字,压入栈;
  4. 遇到运算符,弹出栈顶的两个数字,执行运算后将结果压入栈;
  5. 重复上述过程,直到遍历完成;
  6. 栈顶的数字即为最终结果。

三、后缀表达式(重点)

后缀表达式也叫逆波兰表达式,其特点是:运算符写在两个操作数之后,比如:

代码语言:java
AI代码解释
复制
54321+/\*-

该后缀表达式所对应的中缀表达式同样是

代码语言:java
AI代码解释
复制
5-4\*3/(2+1)

后缀表达式的优势

  • 不需要括号;
  • 运算顺序唯一且明确;
  • 更加贴近计算机的处理方式。

后缀表达式的计算方式:

  1. 初始化一个栈 stack;
  2. 从左至右遍历表达式;
  3. 遇到数字,压入栈;
  4. 遇到运算符,从栈顶弹出两个数字,执行运算后将结果压入栈;
  5. 重复上述操作,直到遍历结束;
  6. 栈顶元素即为最终计算结果。

流程图如下:

最后栈中剩下的值就是最终的计算结果。

总结

从计算机处理的角度来看,前缀和后缀表达式具有更明确的结构和更线性的执行流程,只需借助一个栈即可完成整个表达式的计算过程。而在实际应用中,由于后缀表达式的运算更加直观简洁,因此它被更广泛地用于计算机内部的表达式求值中。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
前缀、中缀、后缀表达式
转至: 前缀、中缀、后缀表达式 它们都是对表达式的记法,因此也被称为前缀记法、中缀记法和后缀记法。它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前;中缀和后缀
Christal_R
2017/12/25
1.1K0
前缀、中缀、后缀表达式「建议收藏」
关键字:概念, 前缀表达式, 前缀记法, 中缀表达式, 中缀记法, 波兰式, 后缀表达式, 后缀记法, 逆波兰式
全栈程序员站长
2022/07/05
2.3K0
计算器:中缀表达式转后缀表达式
例如:中缀表达式(8+9*10)-4/2+3 我们可以进行如下操作: 1、将每个操作符对应的两个操作数用括号括上(((8+(9*10))-(4/2))+3) 2、将操作符移到对应的括号外(((8(910*)+)(42)/)-3)+ 3、去掉括号即可  8910*+42/-3+
卡尔曼和玻尔兹曼谁曼
2019/01/25
2.3K0
关于栈的三种表达式
前缀表达式也称为波兰表达式,前缀表达式的运算符位于操作数之前 如 ( 3 + 4 ) * 5 - 6 对应的前缀表达式为 - * + 3 4 5 6
切图仔
2022/09/14
3220
Java数据结构和算法(六)——前缀、中缀、后缀表达式
  前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功
IT可乐
2018/01/04
1.8K0
Java数据结构和算法(六)——前缀、中缀、后缀表达式
2022: 暴杀表达式, 脚踩逆波兰的时候到了
前缀表达式是一种没有括号的算术表达式,与中缀表达式不同的是,其将运算符写在前面,操作数写在后面。为纪念其发明者波兰数学家Jan Lukasiewicz,前缀表达式也称为“波兰式”。例如,- 1 + 2 3,它等价于1-(2+3)。
冷环渊
2022/01/04
7120
2022: 暴杀表达式, 脚踩逆波兰的时候到了
彻底用图解教会你——中缀表达式转后缀和前缀
中缀表达式,大家最熟悉了。就是运算符在操作数中间。像这样: 1 + 2 * 3 + 4 它的特点是: 运算符和操作数必须依次间隔出现,不允许两个操作数中间没有运算符,也不允许两个运算符中间没有操作数。 备注:一元运算符等特殊情况除外。 如果要改变表达式的计算顺序,只有一种方法,加括号,像这样: (1 + 2) * (3 + 4) 括号的本质: 括号其实是提高了括号里面运算符的优先级,而且括号嵌套的层次越多,它里面的运算符的优先级提高的就越多。 中缀和括号的优点: 非常直观,特别适合人类理解。 中缀和括号的缺点: 不够纯粹,毕竟括号和普通运算符是不一样的。还有就是计算机无法直接计算。 于是一个波兰的数学家就想办法把括号去掉了,就是下面这个。 前缀表达式,运算符写在前面,操作数写在后面,像这样: * + 1 2 + 3 4 这就是上面那个带括号的对应的前缀形式,可以看到括号已经没有了。 它的特点是: 以运算符开头,以操作数结尾,除此之外没有什么特点,且一眼看上去根本看不出对错,多个运算符可以挨在一起,多个操作数也可以挨在一起。特别是初学者,一定要记住这些,不要受中缀的影响。 大家为了纪念这哥们儿,也称这种形式为“波兰式”。 不得不说,人类还是很善于思考的,既然运算符在操作数前面是可以的,那么倒过来是不是也可以啊? 后缀表达式,操作数写在前面,运算符写在后面,像这样: 1 2 + 3 4 + * 这就是上面那个带括号的对应的后缀形式,可以看到括号也已经没有了。 它的特点是: 以操作数开头,以运算符结尾,然后就和前缀是一样的,一眼看不出对错,运算符可以挨着,操作数可以挨着,这里再次提醒初学者,要记住这些特点。 由于这种形式和“波兰式”正好相反,因此也称为“逆波兰式”。 后缀式和前缀式的计算过程 表达式的计算要用到栈,所以先准备两个栈,一个用红色标记,一个用绿色标记。 后缀式的计算过程,先看动画,再看分步解析:
帅地
2020/03/10
6.9K0
彻底用图解教会你——中缀表达式转后缀和前缀
五分钟小知识之什么是后缀表达式
后缀表达式,又称逆波兰式,指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则)。
五分钟学算法
2019/05/23
3.7K0
五分钟小知识之什么是后缀表达式
前缀、中缀、后缀表达式
它们都是对表达式的记法,因此也被称为前缀记法、中缀记法和后缀记法。它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前;中缀和后缀同理。 举例: (3 + 4) × 5 - 6 就是中缀表达式 - × + 3 4 5 6 前缀表达式 3 4 + 5 × 6 - 后缀表达式 中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间。中缀表达式是人们常用的算术表示方法。 虽然人的大脑很容易理解与分析中缀表达式,但对计算
_gongluck
2018/03/08
1.3K0
C++ 使用栈求解中缀、后缀表达式的值
表达式求值对于有知识经验的人类而言,可以通过认知,按运算符的优先级进行先后运算。但对计算机而言,表达式仅是一串普通的信息而已,需要通过编码的方式告诉计算机运算法则。这个过程则需要借助于栈来实现。
一枚大果壳
2022/12/20
9130
C++ 使用栈求解中缀、后缀表达式的值
中缀表达式转后缀表达式的方法,步骤和原理及后缀表达式运算方式
中缀转后缀 本文大部分资料参考慕课何钦铭老师的数据结构 相关的慕课链接:表达式求值 中缀表达式是最常用的算术表达式,运算符在运算数中间,运算需要考虑运算符优先级. 后缀表达式是计算机容易运算的表达式,运算符在运算数后面,从左到右进行运算,无需考虑优先级,运算呈线性结构. 先举个简单的转换例子 2+9/3-5 (前缀)-> 2 9 3 / + 5 – (后缀) 先进行乘除再进行加减 运算规律,运算数位置不变,改变的是运算符位置 可以推栈实现,用堆栈储存等待中的运算符. 将当前运算符与最后一个等待的运算符比较.
全栈程序员站长
2022/07/04
4870
中缀表达式转后缀表达式的方法,步骤和原理及后缀表达式运算方式
六十四、前缀,后缀,中缀表达式转化求值问题
上次介绍如何利用栈实现中缀表达式求值,如果我是出题官,当然要考前缀,后缀,中缀表达式相互转换,然后就变成了利用栈实现前缀和后缀表达式求值。
润森
2022/08/17
4000
波兰表达式 与 逆波兰表达式
逆波兰表达式(Reverse Polish Notation,RPN),又称为后缀表达式,是一种特殊的算术表达式形式。
2025/01/20
2060
波兰表达式 与 逆波兰表达式
五分钟小知识之什么是前缀表达式
算术表达式是最常用的表达式,又称为数值表达式。它是通过算术运算符来进行运算的数学公式。
五分钟学算法
2019/05/22
1.8K0
五分钟小知识之什么是前缀表达式
C++题解 | 逆波兰表达式相关
好久没有更新题解系列博客了,今天要学习的是 逆波兰表达式,作为计算机中的重要概念,值得花时间去学习,并且其中还必须使用 容器适配器,非常适合用来练手
北 海
2023/07/01
2200
C++题解 | 逆波兰表达式相关
算数四则混合运算表达式求值
算数混合四则运算求值 [问题] 利用算符优先关系,实现对算术四则混合运算表达式的求值 [要求] 输入的形式:表达式,例如2*(3+4) 包含的运算符只能有’+’ 、‘-’ 、‘*’ 、‘/’ 、‘(’、 ‘)’; 输出的形式:运算结果,例如2*(3+4)=14; 程序所能达到的功能:对表达式求值并输出 思路:利用栈实现表达式求值,需要思考如下问题: 算符的优先级 字符转换成数字(包括解析小数) 主要思路: 算术表达式有三种类型:前缀,中缀,后缀表达式,而这里主
用户9645905
2022/11/30
8560
算数四则混合运算表达式求值
中缀表达式转换为后缀表达式(栈的使用)
中缀表达式如1*2+(2-1), 其运算符一般出现在操作数之间, 因此称为中缀表达式,也就是大家编程中写的表达
全栈程序员站长
2022/07/20
4340
栈(2)
从右往左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对他们做相应的计算(栈顶元素和次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式结果。
JusterZhu
2022/12/07
2350
栈(2)
golang 计算器实现
  可能有读者会疑惑我们为什么将num定义为int,我们这么做的原因是为了简便,或者说就是偷懒吧,因为如果要支持使用者输入小数,那么我们的程序在获取、处理输入方面的代码会更加复杂一点╮(╯_╰)╭。关于如何获取、处理输入,我们将在本文的最后给出答案。同时也会给出完整的计算器程序代码,或者说是给出完整的只支持整数输入的、不具备查错纠错能力的四则运算计算器
golangLeetcode
2022/08/02
8740
golang 计算器实现
数据结构与算法-(7)---栈的应用拓展-前缀表达式转换+求值
之前我们介绍过了什么是后缀表达式,以及它如何通过中缀表达式进行转换,以及关于后缀表达式的求值问题,如有遗忘👉🔗http://t.csdnimg.cn/Hl4Y9
ImAileen
2024/01/18
2520
数据结构与算法-(7)---栈的应用拓展-前缀表达式转换+求值
相关推荐
前缀、中缀、后缀表达式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档