中缀表达式求值讲解

举报
Linux猿 发表于 2021/11/25 22:59:34 2021/11/25
【摘要】 🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊! 🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬

🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


在前面的文章中我们已经讲解过栈的用法,本节要讲的内容是表达式求值问题,需要借助栈的辅助来完成。表达式求值中中缀表达式求值是比较常见的求值问题,如求表达式3 + (2 * 3 + 21)*2的值。在历年考研真题中经常以填空题的形式出现,接下来就开始我们的讲解吧!

一、基本概念

中缀表达式:是我们通常理解的一种算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间。

  表达式求值中包含操作符和操作数,需要借助两个栈分别用来存放操作符和操作数。

二、求解思路

1、依次遍历表达式,遇到操作数压入到操作数栈;

2、当遇到操作符时,判断当前操作符与栈顶操作符的优先级。如果当前操作符的优先级大于栈顶操作符优先级,那么把当前操作符压入操作符栈中;否则在操作数栈中弹出两个操作数,弹出的第一个操作数为运算的右值,把运算之后的数值压入操作数栈中。

3、遇到右括号的时候,弹出操作符和操作数运算,将运算的结果压入到操作数中,一直计算,直到遇到左括号终止。

4、遍历完表达式之后,如果操作符栈中有值,那么弹出操作数栈的两个数进行运算,将运算的结果压入操作数栈中,重复步骤四。

5、直到操作符栈为空或者操作数栈中只剩下一个数。

三、实战演练

  假设有表达式:

9 +  4  *( 2 + 6 / 3 )-  5

解题步骤如下:

步骤

描述

操作

数栈

操作

符栈

1

首先遇到9,把9压入操作数栈

9


2

遇到+,把+压入操作符栈

9

+

3

遇到4,把4压入操作数栈

9,4

+

4

遇到*,优先级大于+,压入操作符栈

9,4

+,*

5

遇到(,压入操作符栈

9,4

+,*,(

6

遇到2,压入操作数栈中

9,4,2

+,*,(

7

遇到+,优先级大于(,压入操作符栈

9,4,2

+,*,(,+

8

遇到 6,压入操作数栈

9,4,2,6

+,*,(,+

9

遇到/,压入操作符栈

9,4,2,6

+,*,(,+,/

10

遇到3,压入操作数栈

9,4,2,6,3

+,*,(,+,/

11

遇到),弹出操作符栈顶/,弹出两个操作数进行运算6/3=2,把2压入操作数栈

9,4,2,2

+,*,(,+

12

弹出操作符栈顶+,弹出两个操作数进行运算2+2=4,把4压入操作数栈中

9,4,4

+,*(

13

弹出操作符栈(

9,4,4

+,*

14

遇到-,优先级小于*,弹出操作符栈顶*,弹出两个操作数进行运算4*4=16,把16压入操作数栈

9,16

+

15

弹出操作符栈顶+,弹出两个操作数进行运算9+16=25,把25压入操作数栈中

25


16

将-压入操作符栈中

25

-

17

遇到5,将5压入操作数栈中

25,5

-

18

表达式遍历结束,操作符栈中有值,继续弹出操作符栈顶-,弹出两个操作数进行运算25-5=20,把20压入操作数栈中,此时操作数栈中剩下一个数据即为最终数据

20


四、总结

对于表达式求值问题,需要多练多写多模拟,记住解题思路。在工大历年考研真题中,经常以填空题的形式出现,当然还有后缀表达式求值问题,中缀转后缀问题,都可以借助栈的辅助来求解,后面我们会对另外两种进行讲解,敬请期待!

大家有不理解的可以在评论区评论哦!


CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

 欢迎小伙伴们点赞👍、收藏⭐、留言💬


【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。