中缀,后缀,前缀表达式转换和求值
平常我们阅读使用的都是中缀表达式,但是计算机并不能识别,需要转成前缀或后缀表达式计算机才能进行计算(转化时还能去掉括号)。整个过程分为两部分:表达式转换,求值。
表达式转换。
一般的表达式中常见的运算: + , − , × , / +,-,\times,/ +,−,×,/
特殊的符号: ( , ) ( \ ,\quad ) ( ,)
特殊运算符: ∧ \wedge ∧ 幂指数运算
以字符串 a × b + c − d / ( e ∧ f ∧ g × h ) a \times b + c - d / (e^{\wedge} f^{\wedge} g \times h) a×b+c−d/(e∧f∧g×h) 为例。
中缀转后缀
过程:
- 读入数字,直接输出
- 读入 + , − , × , / +,-,\times,/ +,−,×,/ 之前 , 输出前面优先级大于等于该运算符的运算符,然后将该字符存入字符栈;最后输出全部剩余字符
- 左右括号:左括号,直接读入字符栈;读入右括号,输出字符栈中的字符,一直到左括号为止。
- 读入 ∧ \wedge ∧, 要输出前面优先级大于该运算符的运算符(实际上并没有)。
结果: a , b , × , c , + , d , e , f , g , ∧ , ∧ , h , × , / , − a,b,\times,c,+,d,e,f,g,\wedge,\wedge,h,\times,/,- a,b,×,c,+,d,e,f,g,∧,∧,h,×,/,−
中缀转前缀
和后缀很相似,但是前缀都是倒过来的:倒着读入中缀表达式
- 读入数字,直接存入输出列
- 读入 + , − , × , / +,-,\times,/ +,−,×,/ 之前 , 弹出前面优先级大于该运算符的运算符,然后将该字符存入字符栈;最后弹出全部剩余字符
- 左右括号:右括号,直接读入字符栈;读入左括号,输弹出字符栈中的字符,一直到右括号为止。
- 读入 ∧ \wedge ∧, 要弹出前面优先级大于等于该运算符的运算符(实际上只有自己)。
最后倒着输出!!!
结果: − , + , × , a , b , c , / , d , × , ∧ , e , ∧ , f , g , h -,+,\times,a,b,c,/,d,\times,\wedge,e,\wedge,f,g,h −,+,×,a,b,c,/,d,×,∧,e,∧,f,g,h
后缀转中缀
其实更加简单。
为了方便起见,我们默认初始的单个变量左右都带有括号。左右是括号的称为表达式。
按照后缀表达式的运算顺序,在碰到运算操作的时候,将运算符插入到前面两个表达式中间,然后再两个表达式两端加上括号,构成一个新的表达式加入到栈中。
最后栈中只剩下一个中缀表达式,就是最终的结果。
前缀转中缀
和后缀转中缀原理是一样的,注意顺序即可。
运算
后缀表达式
正常读入。数字存入数字栈;读入运算符,立即对栈顶两个数进行运算,然后合并成一个数。
s t a c k [ t o p − 1 ] = s t a c k [ t o p − 1 ] o p e r a t o r s t a c k [ t o p ] t o p − − stack[top-1] = stack[top-1]\ \ operator \ stack[top]\\ top-- stack[top−1]=stack[top−1] operator stack[top]top−−
前缀表达式
倒着读入。也是读入运算符立即运算,顺序不同。
s t a c k [ t o p − 1 ] = s t a c k [ t o p ] o p e r a t o r s t a c k [ t o p − 1 ] t o p − − stack[top-1] = stack[top]\ \ operator \ stack[top-1]\\ top-- stack[top−1]=stack[top] operator stack[top−1]top−−