[数据结构与算法] 5,栈的应用-四则运算表达式求值

1,后缀(逆波兰)表示法定义

计算器可以帮忙计算一些简单的加减乘除,但是如果遇到一些比较复杂的,比如说有大中小括号的四则运算,那么一些普通的计算器就无法实现运算了,但是观察发现,所有的括号都是成对出现的,大中小括号其实也是嵌套的。

有了后缀表达法,我们可以把9 + ( 3 - 1 ) * 3 + 10 / 2表示为9 3 1 - 3 * + 10 2 / +,从左到右,遇到运算符号就将前面两个数字进行运算,用栈来解释就是:

从左到右,遇到数字就进栈,遇到运算符就将栈顶两个元素进行运算,运算结果再进栈,如下图:

[数据结构与算法] 5,栈的应用-四则运算表达式求值_第1张图片[数据结构与算法] 5,栈的应用-四则运算表达式求值_第2张图片

[数据结构与算法] 5,栈的应用-四则运算表达式求值_第3张图片[数据结构与算法] 5,栈的应用-四则运算表达式求值_第4张图片

[数据结构与算法] 5,栈的应用-四则运算表达式求值_第5张图片



那么我们如何将其转化为后缀表达式呢?以中缀表达式9 + ( 3 - 1 ) * 3 + 10 / 2作为例子。

规则:从左到右遍历中缀表达式每个数字跟符号,如果是数字就输出,也就是成为后缀表达式的一部分,如果是符号,那么就判断其与栈顶符号的优先级,是右括号或者优先级没有比栈顶元素高(入栈的始终都是优先级比栈顶元素大的,比如乘除大于加减),那么就把栈顶元素出栈。

1,初始化一个空栈,用来对符号进栈或者出栈使用。遇到数字都是直接输出的,所以下面输出9,+入栈

[数据结构与算法] 5,栈的应用-四则运算表达式求值_第6张图片

2,接下来遇到  ( 左括号,入栈,遇到数字3输出,遇到 - 减号入栈,遇到数字1输出

[数据结构与算法] 5,栈的应用-四则运算表达式求值_第7张图片

3,接下来遇到右括号),跟前面的左括号进行配对,所以 - 减号出栈输出,所以现在表达式变成 ”9 3 1 -“ , 栈中剩下 + 号

4,接下来遇到乘号*,跟栈顶元素 + 对比,乘号优先级比较高,所以乘号入栈,然后遇到数字3输出,如下图:

[数据结构与算法] 5,栈的应用-四则运算表达式求值_第8张图片

5,接下来遇到 + 加号,对比栈顶元素,优先级没有栈顶元素高,所以,栈顶的*乘号先出栈,紧接着的+加号优先级跟即将要入栈的 + 加号优先级一样,所以栈中的 + 加号出栈,即将入栈的加号入栈(9 + ( 3 - 1 ) * 3 +,也就是最后面那个)。也就是说,现在输出的加号是前面入栈的加号。

6,接下来遇到10,直接输出,遇到除号入栈(除号的优先级高于栈中的加号,入栈的始终都是优先级比栈顶高),如下图

[数据结构与算法] 5,栈的应用-四则运算表达式求值_第9张图片

7,最后一个数字是2,直接输出,已经没有其与的中缀表达式符号了,栈中所有的符号(/ +)出栈,那么后缀表达式完成

[数据结构与算法] 5,栈的应用-四则运算表达式求值_第10张图片

从上面的这个过程,我们得出一个总结:

1 将中缀表达式转化成后缀表达式(栈用来进出运算的符号)

2 将后缀表达式进行运算得出结果 (栈用来进出运算的数字)



你可能感兴趣的:(数据结构与算法)