admin管理员组文章数量:1029566
计算机是如何理解表达式的?从中缀到后缀一文搞定!
表达式
在学习数据结构和算法时,我们常常会接触到表达式的不同写法,它们分别是中缀表达式、前缀表达式和后缀表达式。我们日常最熟悉的表达形式就是中缀表达式,如下所示:
代码语言:java复制5-4\*3/(2+1)
中缀表达式最符合人类的书写和阅读习惯,但对于计算机来说,它却并不友好。于是,为了更高效地进行计算,我们引入了前缀和后缀表达式的表示方式。
一、中缀表达式
中缀表达式是我们平时学习和使用的表达方式,它的特点是:运算符位于两个操作数之间,并且可以通过括号来调整运算优先级。
虽然中缀表达式易于阅读,但它存在如下问题:
- 运算顺序不明确,依赖运算符优先级与括号;
- 结构不够线性,计算过程复杂,不适合计算机直接解析。
中缀表达式的计算(借助两个栈)
为了让计算机也能处理中缀表达式,我们可以借助两个栈:
栈1(操作数栈):用于保存操作数;
栈2(运算符栈 :用于保存运算符。
基本步骤如下:
- 从左至右遍历表达式;
- 遇到操作数,入栈1;
- 遇到运算符,比较其优先级:
如果栈2为空,或当前运算符优先级大于栈顶运算符,入栈;
否则弹出栈2顶端运算符,同时从栈1中弹出两个操作数进行运算,将结果压入栈1,然后继续比较;
- 遇到左括号直接入栈,遇到右括号则不断弹出栈2并计算,直到遇到左括号;
- 遍历结束后,如果栈2不为空,继续弹出并计算,直到栈清空;
最终栈1中的元素即为表达式的计算结果。
流程如下:
二、前缀表达式
前缀表达式又称波兰表达式,其特点是:运算符写在两个操作数的前面,如下所示:
代码语言:java复制-5\*4/3+12
该前缀表达式所对应的中缀表达式是
代码语言:java复制5-4\*3/(2+1)
前缀表达式的优势在于,完全不依赖括号或运算符优先级来确定运算顺序。按照从右往左的顺序遍历,先遇到的运算符先进行运算。
前缀表达式的计算方式(借助栈):
- 初始化一个栈 stack;
- 从右往左遍历表达式;
- 遇到数字,压入栈;
- 遇到运算符,弹出栈顶的两个数字,执行运算后将结果压入栈;
- 重复上述过程,直到遍历完成;
- 栈顶的数字即为最终结果。
三、后缀表达式(重点)
后缀表达式也叫逆波兰表达式,其特点是:运算符写在两个操作数之后,比如:
代码语言:java复制54321+/\*-
该后缀表达式所对应的中缀表达式同样是
代码语言:java复制5-4\*3/(2+1)
后缀表达式的优势
- 不需要括号;
- 运算顺序唯一且明确;
- 更加贴近计算机的处理方式。
后缀表达式的计算方式:
- 初始化一个栈 stack;
- 从左至右遍历表达式;
- 遇到数字,压入栈;
- 遇到运算符,从栈顶弹出两个数字,执行运算后将结果压入栈;
- 重复上述操作,直到遍历结束;
- 栈顶元素即为最终计算结果。
流程图如下:
最后栈中剩下的值就是最终的计算结果。
总结
从计算机处理的角度来看,前缀和后缀表达式具有更明确的结构和更线性的执行流程,只需借助一个栈即可完成整个表达式的计算过程。而在实际应用中,由于后缀表达式的运算更加直观简洁,因此它被更广泛地用于计算机内部的表达式求值中。
计算机是如何理解表达式的?从中缀到后缀一文搞定!
表达式
在学习数据结构和算法时,我们常常会接触到表达式的不同写法,它们分别是中缀表达式、前缀表达式和后缀表达式。我们日常最熟悉的表达形式就是中缀表达式,如下所示:
代码语言:java复制5-4\*3/(2+1)
中缀表达式最符合人类的书写和阅读习惯,但对于计算机来说,它却并不友好。于是,为了更高效地进行计算,我们引入了前缀和后缀表达式的表示方式。
一、中缀表达式
中缀表达式是我们平时学习和使用的表达方式,它的特点是:运算符位于两个操作数之间,并且可以通过括号来调整运算优先级。
虽然中缀表达式易于阅读,但它存在如下问题:
- 运算顺序不明确,依赖运算符优先级与括号;
- 结构不够线性,计算过程复杂,不适合计算机直接解析。
中缀表达式的计算(借助两个栈)
为了让计算机也能处理中缀表达式,我们可以借助两个栈:
栈1(操作数栈):用于保存操作数;
栈2(运算符栈 :用于保存运算符。
基本步骤如下:
- 从左至右遍历表达式;
- 遇到操作数,入栈1;
- 遇到运算符,比较其优先级:
如果栈2为空,或当前运算符优先级大于栈顶运算符,入栈;
否则弹出栈2顶端运算符,同时从栈1中弹出两个操作数进行运算,将结果压入栈1,然后继续比较;
- 遇到左括号直接入栈,遇到右括号则不断弹出栈2并计算,直到遇到左括号;
- 遍历结束后,如果栈2不为空,继续弹出并计算,直到栈清空;
最终栈1中的元素即为表达式的计算结果。
流程如下:
二、前缀表达式
前缀表达式又称波兰表达式,其特点是:运算符写在两个操作数的前面,如下所示:
代码语言:java复制-5\*4/3+12
该前缀表达式所对应的中缀表达式是
代码语言:java复制5-4\*3/(2+1)
前缀表达式的优势在于,完全不依赖括号或运算符优先级来确定运算顺序。按照从右往左的顺序遍历,先遇到的运算符先进行运算。
前缀表达式的计算方式(借助栈):
- 初始化一个栈 stack;
- 从右往左遍历表达式;
- 遇到数字,压入栈;
- 遇到运算符,弹出栈顶的两个数字,执行运算后将结果压入栈;
- 重复上述过程,直到遍历完成;
- 栈顶的数字即为最终结果。
三、后缀表达式(重点)
后缀表达式也叫逆波兰表达式,其特点是:运算符写在两个操作数之后,比如:
代码语言:java复制54321+/\*-
该后缀表达式所对应的中缀表达式同样是
代码语言:java复制5-4\*3/(2+1)
后缀表达式的优势
- 不需要括号;
- 运算顺序唯一且明确;
- 更加贴近计算机的处理方式。
后缀表达式的计算方式:
- 初始化一个栈 stack;
- 从左至右遍历表达式;
- 遇到数字,压入栈;
- 遇到运算符,从栈顶弹出两个数字,执行运算后将结果压入栈;
- 重复上述操作,直到遍历结束;
- 栈顶元素即为最终计算结果。
流程图如下:
最后栈中剩下的值就是最终的计算结果。
总结
从计算机处理的角度来看,前缀和后缀表达式具有更明确的结构和更线性的执行流程,只需借助一个栈即可完成整个表达式的计算过程。而在实际应用中,由于后缀表达式的运算更加直观简洁,因此它被更广泛地用于计算机内部的表达式求值中。
本文标签: 计算机是如何理解表达式的从中缀到后缀一文搞定!
版权声明:本文标题:计算机是如何理解表达式的?从中缀到后缀一文搞定! 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/jiaocheng/1747601355a2191608.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论