掌握前缀表达式丶后缀表达式
制作安卓小项目比如一个简单计算器时,为了实现计算器‘计算’的逻辑功能,我们往往首先需要弄清楚后缀表达式丶前缀表达式的计算,在讲这两个表达式之前我们需要先了解中缀表达式的含义。
所谓中缀表达式就是我们人类能直观理解的算术或者逻辑公式,这种表达式结构方便人类理解,但是不便于计算机解析,中缀表达式的表现形式为:左操作数 操作符 右操作数,比如 1 + 2 这个中缀表达式,1 是左操作数,操作符是 +,右操作数是 2。
可以看出来,算术表达式的命名是根据操作符相对于操作数的位置命名的。
所谓前缀表达式就是操作符位于左操作数前面,表现形式为:操作符 左操作数 右操作数,比如 + 1 2 就是一个前缀表达式,相应地可以得到后缀表达式就是操作符位于右操作数的后面,表现形式为:左操作数 右操作数 操作符,比如 1 2 + 就是一个后缀表达式。
要让计算器计算出中缀表达式的结果,需要先把中缀表达式转换成前缀表达式或者后缀表达式,计算机才能解析。
先来看看中缀表达式如何转换成前缀表达式
假设现在有这样一个中缀表达式:1+((2+3)*4)-5
需要准备的东西:一个用来存放运算符(操作符)的栈,一个用来存放临时输出结果的栈,一个中缀表达式。
运算符(操作符)优先级:')' > '^' > '*' || '/' > '+' || '-'
遵循法则:从右往左扫描中缀表达式,扫描到数字串直接进入临时结果栈;扫描到运算符,如果符号栈为空,直接进符号栈;如果扫描到运算符是右括号 ')',直接进入符号栈,如果符号栈栈顶元素是右括号,不管扫描到什么运算符,直接进栈;如果符号栈栈顶元素优先级高于扫描运算符,符号栈弹出栈顶元素,并将其输出到临时栈中,直到符号栈栈顶元素优先级小于等于扫描运算符优先级,此时扫描运算符进入符号栈;如果扫描到左括号 '(',将此时符号栈自上往下的第一个右括号之后的所有运算符弹出符号栈并按弹出顺序依次进入临时栈中,接着弹出第一个右括号;接着重复上述操作直到扫描中缀表达式完毕,弹出此时符号栈元素,并依次输出到临时栈中,再将临时栈中元素弹出可得前缀表达式。
中缀转前缀我的word过程截图:
输出前缀表达式:-+1*+2345
接着我们来看看中缀表达式如何转换为后缀表达式:
遵循法则:从左往右扫描中缀表达式,扫描到数字串直接进入临时结果栈;扫描到运算符,如果符号栈为空,直接进符号栈;如果扫描到运算符是左括号 '(',直接进入符号栈,如果符号栈栈顶元素是左括号,不管扫描到什么运算符,直接进栈;如果符号栈栈顶元素优先级高于等于扫描运算符,符号栈弹出栈顶元素,并将其输出到临时栈中,直到符号栈栈顶元素优先级小于扫描运算符优先级,此时扫描运算符进入符号栈;如果扫描到右括号 ')',将此时符号栈自上往下的第一个左括号之后的所有运算符弹出符号栈并按弹出顺序依次进入临时栈中,接着弹出第一个左括号;接着重复上述操作直到扫描中缀表达式完毕,弹出此时符号栈元素,并依次输出到临时栈中,再将临时栈中元素弹出后再逆序就可以得到后缀表达式了。
中缀转后缀我的word过程截图:
输出后缀表达式:123+4*+5-
讲到这里相信各位简友们都理解了吧。