- 1 中缀表达式转后缀表达式(从左到右)
方法一:直接转换法
(1)首先确定表达式表达式A的运算顺序,然后加括号:((1 + (( 2 + 3)* 4 )) – 5 )
(2)从最里面的一层括号开始运算,转换成后缀表达式的方法为:(忽略括号)数字在前,符号在后。
1)( 2 + 3) => 23+
2) (( 2 + 3)* 4 ) => 23+4*
3) (1 + (( 2 + 3)* 4 ))=> 123+4*+ [按照运算次序,从左到右排列]
4)((1 + (( 2 + 3)* 4 )) – 5 )=> 123+4*+ 5-
后缀表达式为:12 3 + 4 * + 5 –
方法二:利用表达式树(未详细看)
https://blog.youkuaiyun.com/qq_33243189/article/details/80222629
首先将中缀表达式转换为表达式树,然后后序遍历表达式树,所得结果就是后缀表达式。
将中缀表达式转化为表达式树的方法:表达式树的树叶是操作数,而其他节点为操作符,根结点为优先级最低且靠右的操作符(如上述表达式优先级最低是-和+,但-最靠右,所以根为-),圆括号不包括。如上述表达式的表达式树为:
- 2 中缀表达式转为前缀表达式(从右到左)
https://blog.youkuaiyun.com/qq_33243189/article/details/80222629
假定有中缀表达式1 + (( 2 + 3)* 4 ) – 5,请将它转化为前缀表达式。
方法一:直接转换法
(1)首先确定表达式表达式A的运算顺序,然后加括号:((1 + (( 2 + 3)* 4 )) – 5 )
(2)从最里面的一层括号开始运算,转换成前缀表达式的方法为:(忽略括号)符号在前,数字在后。
1)( 2 + 3) => +23
2) (( 2 + 3)* 4 ) => *+234
3) (1 + (( 2 + 3)* 4 ))=> +1*+234
4)((1 + (( 2 + 3)* 4 )) – 5 )=> -+1*+2345
前缀表达式为:-+1*+2345
方法二:利用表达式树
首先将中缀表达式转换为表达式树,然后先序遍历表达式树,所得结果就是前缀表达式。
将中缀表达式转化为表达式树的方法:表达式树的树叶是操作数,而其他节点为操作符,根结点为优先级最低且靠右的操作符(如上述表达式优先级最低是-和+,但-最靠右,所以根为-),圆括号不包括。
经过前序遍历所得前缀表达式为:- + 1 * + 2 3 4 5
注:数字的相对位置不变,变得只是运算符的位置;
- 3 用后缀表达式(逆波兰表达式)编计算器。
思路:
应用到一个系统栈,从左到右遍历逆波兰表达式,遇到数字,进栈,遇到操作符,出栈,拿出两个数进行运算,并将结果继续入栈,重复操作即可
代码:
package stack;
import java.util.Stack;
public class PolandNotation {
public static void main(String[] args) {
//用后缀表达式,计算(逆波兰表达式),用系统栈代替
//(3+4)*5-6 => 后缀表达式为,34+5*6-
String expression = "3 4 + 5 * 6 -";
//思路:
//1、先将 "3 4 + 5 * 6 -"放入数组中,
//2、遍历数组,配合栈,完成运算
String[] strings = expression.split(" ");
Stack<Integer> stack = new Stack<Integer>();
int i = 0;
String oper;
while(true) {
if(i>=strings.length) {
break;
}
if(strings[i].matches("\\d+")) {//正则表达式,是数,则入栈
stack.push(Integer.parseInt(strings[i]));
}else {//是符号
oper = strings[i];
stack.push(calculator(stack.pop(),stack.pop(),oper));
}
i++;
}
System.out.println("最终结果:"+stack.pop());
}
private static Integer calculator(int pop1, int pop2, String oper) {
// TODO Auto-generated method stub
int res = 0;
switch (oper) {
case "+":
res = pop2 + pop1;
break;
case "-":
res = pop2 - pop1;
break;
case "*":
res = pop2 * pop1;
break;
case "/":
res = pop2 / pop1;
break;
default:
throw new RuntimeException("运算符错误,请检查!");
}
return res;
}
}