【夜深人静学数据结构与算法 | 第二篇】后缀(逆波兰)表达式

目录

前言: 

中缀表达式:

 后缀表达式:

中缀表达式转后缀表达式:

后缀表达式计算结果:

总结: 


前言: 

计算机在计算四则运算的时候,由于括号以及运算优先级的存在,并不能够很好的处理所有的运算,为了处理这种情况,我们引入了后缀表达式来优化算法。

中缀表达式:

        中缀表达式是常见的数学表达式表示方法,即操作数位于操作符之间。例如,最常见的中缀算术表达式是 "3 + 4"。中缀表达式有一个显著的特点,就是需要采用运算符优先级来确定表达式的计算顺序。如果表达式中包含不同优先级的运算符,则需要采用约定的优先级规则来计算表达式。在处理中缀表达式时,通常需要将表达式转换为逆波兰表达式或前缀表达式来方便计算。

 后缀表达式:

        逆波兰表达式,又称后缀表达式,是一种数学表达式的表示方法。在逆波兰表达式中,操作符在操作数之后,因此也被称为后缀表示法。例如,表达式 “3 + 4” 在逆波兰表达式中表示为 “3 4 +”。逆波兰表示法可以通过栈来实现,首先将所有操作数入栈,每当遇到一个操作符时,弹出栈顶的两个操作数进行运算,并将运算结果再次压入栈中,直到整个表达式处理完毕。与传统的中缀表达式相比,逆波兰表达式的优点是可以不用考虑运算符优先级的问题。

后缀表达式巧妙地解决了计算机在处理数字运算的时候难处理算数优先级的问题。

中缀表达式转后缀表达式:

转化规则:从左到右遍历中缀表达式中的每个数字和符号,如果是数字就输出,成为后缀表达式的一部分,如果是符号,就判断其与栈顶符号的优先级,是右括号或优先级不高于栈顶符号(乘除优先于加减),则栈顶元素依次出栈并输出,并把当前符号进栈,一直到最后输出后缀表达式为止。

我们以 9+(3-1)*3+10/2 为例:

 第一步:第一个数字是9,直接输出,第二个是+号,进栈

【夜深人静学数据结构与算法 | 第二篇】后缀(逆波兰)表达式_第1张图片

 第二步:第三个符号是 ' ( ' ,依然是符号,但是是左括号还没有配对,因此进栈,左括号之后是3,为数字直接输出,三后面是-号,进栈。-号后面是数字1,出栈

【夜深人静学数据结构与算法 | 第二篇】后缀(逆波兰)表达式_第2张图片

 第三步:数字1后面是 ‘ )’ ,已经满足我们前面提到的如果是右括号就出栈,因此栈顶依次出栈输出,直到 ‘(’ 出栈为止。

【夜深人静学数据结构与算法 | 第二篇】后缀(逆波兰)表达式_第3张图片 第四步:‘)’ 后面是 ‘ * ’ 号,此时入栈的和栈顶都是符号,就要进行比较,因为*的优先级比+高,因此入栈,‘*’号后面是数字3,直接输出

【夜深人静学数据结构与算法 | 第二篇】后缀(逆波兰)表达式_第4张图片

 第五步:数字3后面是‘ + ’号,此时栈顶的 ‘ * ’ 要比‘  +  ’的优先级高,因此栈内的元素全部出栈,‘+’号后面的是数字10,直接输出。需要注意的是此处的+并不是9后面的+,而是3后面的+。

【夜深人静学数据结构与算法 | 第二篇】后缀(逆波兰)表达式_第5张图片

 第六步:10后面是‘ / ’号,直接入栈,‘ / ’号后面是2,数字就输出,因为此时这个式子已经结束了,我们就把栈内剩余的符号依次出栈

【夜深人静学数据结构与算法 | 第二篇】后缀(逆波兰)表达式_第6张图片

 这样我们就得到了9+(3-1)*3+10/2的后缀表达式:9 3 1 - 3 * + 10 2 / +

后缀表达式计算结果:

我们仍然以9+(3-1)*3+10/2为例,我们已经得到了他的后缀表达式为9 3 1 - 3 * + 10 2 / +。

计算规则:从左到右遍历表达式的每一个数字和符号,如果是数字就进栈,如果是符号,就把处于栈顶的两个数字出栈,进行运算,并让计算结果再次进栈,一直到最终获得结果。

第一步:前三个都是数字,我们安排进栈。

【夜深人静学数据结构与算法 | 第二篇】后缀(逆波兰)表达式_第7张图片

第二步:1后面是‘ - ’号,我们就将1出栈作为减数,3作为被减数,计算得到结果2,再把2返回到栈里面。再接着让‘ - ’号后面的3进栈。

【夜深人静学数据结构与算法 | 第二篇】后缀(逆波兰)表达式_第8张图片

第三步:3后面是‘ * ’号,我们就再次调出栈内的两个数字相乘,得到结果6,再把6入栈,在后面是‘ + ’号,就把9和6出栈相加,结果为15,再次返回栈中。

 第四步:把后面两个数字10和2压入栈里面,接下来是符号/,就调出栈顶的2和10,10/2=5,再次把5压入栈内

【夜深人静学数据结构与算法 | 第二篇】后缀(逆波兰)表达式_第9张图片

 第五步:最后一个符号是‘ + ’号,我们就把栈顶的两个元素5和15拿出来,进行相加,把得到结果的20入栈,此时式子已经计算完毕,就是20,就让20出栈,作为最终运算结果。

【夜深人静学数据结构与算法 | 第二篇】后缀(逆波兰)表达式_第10张图片

总结: 

         逆波兰表达式是一个用来解决计算机识别运算优先级很好的思路,它是对栈的一次高级运用,学习逆波兰表达式可以让我们对于栈的作用更加深刻。

今天的内容到这里就结束了,感谢大家的阅读。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

你可能感兴趣的:(数据结构与算法,开发语言,算法,逆波兰表达式)