中缀表达式的求值问题

表达式的求值问题(堆栈)

0. 解决目标

将形如2*(9+6/3-5)+4表达式求值的思想

1. 后缀表达式的求值

形如这里写图片描述的表达式如何求值?
(翻译成中缀表达式为:6/2-3+4*2,我们不进行中缀表达式的翻译操作,只是为了方便理解中间的过程)
从左向右“扫描”,逐个处理运算数和运算符号

  1. 遇到运算数怎么办?如何“记住”目前还不未参与运算的数?

  2. 遇到运算符号怎么办?对应的运算数是什么?
    这里写图片描述
    下图是一种解决办法。
    中缀表达式的求值问题_第1张图片
    这里使用一种结构,由于长得像先称之为“槽”,这种槽有什么特点?

    1.只能存放数字
    2.存放的数字只能后面进来的先出
    这里有个问题,如果是符号怎么办呢?
    我们提供一种解决办法,如果遇到符号,则将槽最顶部的数字与前一个数字从槽中拿出,进行操作,操作为:

    1.前一个数字 运算符 槽最顶部的数字
    2.并讲运算结果 再放入槽中
    3.直至所有东西都按从左到右的顺序 尝试进入槽中,便得到结果。

这种能够解决后缀表达式的求值问题的结构——“槽”,就是堆栈。它是一种线性存储结构,后入先出。
我们用堆栈解决了后缀表达式的求值问题,那么问题来了,如何将中缀表达式转换成后缀表达式呢?
##2. 中缀化后缀

目标:将形如2*(6/3+4)-5的中缀表达式化成 2 6 3 / 4 + * 5 -的后缀表达式

带括号的表达式看起来比较复杂,我们先看没有括号的转换。

小目标:将形如2+9/3-5的中缀表达式化成2 9 3 / + 5 - 的后缀表达式

构造一种堆栈,只能存放符号,同样遵循后入先出的原则。
有两个问题

1.遇到数字怎么办?
2.堆栈中的符号怎么处理?

第一个问题很简单,输出即可,因为我们只需要求表达式,并不需要同时计算。
第二个问题,因为符号有优先级,当将符号放入堆栈时,比较其与前一个符号的优先级,若低于,则先输出前一个运算符。这个也很好理解,高优先级的运算先进行。
解决过程如下图所示。
中缀表达式的求值问题_第2张图片

那如果带括号要怎么解决呢?问题有:

1.括号也算一种符号,但括号不参与运算,
2.括号提供一种优先级,括号里面的运算优先级最高

第一个问题,我们在后缀表达式转换成值的时候是直接进行操作的,利用顺序已经将括号的功能包括进去,但只是不显示括号而已。具体解决是在一对括号齐全时,将其中的运算符输出。
第二个问题,我么将括号放入堆栈之前认为其优先级最高,在放入堆栈之后,将其认为优先级最低,即只进行括号里面的优先级比较(忽略括号)。
解决过程如下图。
中缀表达式的求值问题_第3张图片
总结中缀表达式转化成后缀表达式的方法如下:
中缀表达式的求值问题_第4张图片

按照 步骤2->1->0 完成目标


学习自《数据结构:陈越》之线性结构

你可能感兴趣的:(数据结构学习笔记)