title: 前缀,中缀,后缀表达式转换
date: 2017-09-10 19:45:09
categories: ‘technology’
tags:
- ‘算法’
1 基本概念
在计算机中表达式有三种,前缀表达式(波兰式),中缀表达式,后缀表达式(逆波兰式)。
如表达式:a+b*(c-d)-e/f
前缀表达式:-+a*b-cd/ef
中缀表达式:a+b*(c-d)-e/f
后缀表达式:abcd-*+ef/-
2 转换原理
原理不难,我们遇到遇到操作数的时候直接输出,当遇到操作符(包括‘(’,‘+’,‘-’,‘*’,‘/’)的时候,我们需要把符号压入到栈中,
- 2.1 当遇到‘)’的时候:
我们需要依次从栈顶弹出符号,直到遇到‘(’,并且要将‘(’弹出。如:(a*(b+c)),栈中的是(*(+,当遇到‘)’的时候,我们要弹出‘+’,‘(’。
- 2.2 当遇到‘(’的时候
此时没什么要说的,直接压栈。
- 2.3 当遇到‘+’,‘-’,‘*’,‘/’的时候:
我们要把栈顶元素的符号的优先级跟输入的符号的优先级进行对比,如果栈顶优先级高的话,我们就要把栈顶元素依次弹出,直到栈顶的优先级低于输入的优先级或者栈空。
如:a+b+c+d,跟a+b*c+d得到的符号顺序就不一样,原因就是这个优先级的问题。
- 2.4 当遇到操作数的时候:
毫无疑问,直接输出
例题:
简便方法
中缀表达式(a+b) * c * (d-e/f) 转成前缀,后缀表达式
第一步:按照运算符的优先级对所有的运算单位加括号:式子变成了:((a+(b*c))-(d+e))
第二步:转换前缀与后缀表达式
- 前缀:把运算符号移动到对应的括号前面,则变成拉:-( +(a *(bc)) +(de)) 。把括号去掉:-+a*bc+de 前缀式子出现
- 后缀:把运算符号移动到对应的括号后面,则变成拉:((a(bc)* )+ (de)+ )- 。把括号去掉:abc*+de+- 后缀式子出现