栈应用 : 中缀表达式转后缀表达式求值

1,656 阅读3分钟

中缀表达式

(或中缀记法)是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法。与前缀表达式(例:+ 3 4)或后缀表达式(例:3 4 +)相比,中缀表达式不容易被计算机解析,但仍被许多程序语言使用,因为它符合人们的普遍用法。

确实,中缀表达式很符合人类的思想,但是让计算机理解起来却不那么容易,这里我们引进了==后缀表达式==

后缀表达式(也称为逆波兰表达式)

一个表达式E的后缀形式可以如下定义:
(1)如果E是一个变量或常量,则E的后缀式是E本身。
(2)如果E是E1 op E2形式的表达式,这里op是任何二元操作符,则E的后缀式为E1'E2' op,这里E1'和E2'分别为E1和E2的后缀式。
(3)如果E是(E1)形式的表达式,则E1的后缀式就是E的后缀式。

为了解释后缀表达式的好处,我们先来看看,计算机如何应用后缀表达式计算出9+(3-1)×3+10 ÷ 2=20的 ,转化为后缀表达式为9 3 1 - 3 × + 10 2 ÷+

==规则:从左到右遍历表达式的每个数字和符号,遇到数字的就进栈,遇到是符号,就将处于栈顶的前两个数字出栈,进行运算,运算结果出栈,一直到最终结果。。。==

这个是相对简单的,最复杂的莫过于中缀转后缀了,细节很多。

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

图示-中缀转后缀

以9+(3-1)×3+10 ÷ 2转为后缀表达式" 9 3 1 - 3 × + 10 2 ÷+"为例 1.初始化一空栈,用来对符号进出栈使用,如下 在这里插入图片描述 2.第一个字符是数字9,输出9,后面是符号'+’,进栈。 在这里插入图片描述

3.第三个字符是" (",依然是符号,因为是左括号,还未配对,故进栈。 在这里插入图片描述 4.第四个字符是数字3,输出,总表达式为9 3 ,接着是'' - '',进栈 在这里插入图片描述 5.接下来是数字1,输出,总表达式为9 3 1,后面是符号'' ) '',此时,我们需要去匹配之前的'' ( '',所以栈顶依次出栈,并输出,直到'' ( ''出栈为止。此时左括号上方只有'' - '',因此输出'' - '',总表达式为 9 3 1 - 。 6.紧接着是符号'' × '' ,因为此时的栈顶符号为'' + "号,优先级低于乘号,因此不输出," * "进栈,接着是数字3,输出,总表达式为9 3 1 -3 在这里插入图片描述 7.之后是符号'' + ",此时当前栈顶元素'' * ''比这个'' + "优先级高,因此栈中元素出栈并输出(已经全部出栈,栈空),总输出表达式为9 3 1 -3 * +。然后将当前的'' + "进栈。紧接着数字10,输出,总表达式为9 3 1 - 3 * + 10.后是符号 '' ÷ '',所以'' / ''进栈。最后一个数字2,输出,总表达式为9 3 1 - 3 * + 10 2 在这里插入图片描述 8.因为已经处理完了,所以需要将栈中符号全部出栈并输出。最终输出的后缀表达式为 9 3 1 - 3 * + 10 2 / + 在这里插入图片描述 相应题目 洛谷P1981 Acwing151