介绍:后缀表达式又称逆波兰表达式,是一种操作符总是位于其两操作数之后的表达式,一般数学中的表达式叫做中缀表达式,操作符处于两操作数中间,例如4+2,42,4-2,4/2,而它们转换成后缀表达式是42+,42,42-,42/。
后缀表达式实现原理:遍历表达式,如果当前字符串是数字,则入栈,如果当前字符串是运算符,则从栈中取出两个元素进行相应的运算,最后将运算结果入栈,方便下一个的运算,最终栈中仅剩的一个元素就是后缀表达式最后的结果。
public class ReversePolishNotation {
public static void main(String[] args) {
//中缀表达式4*(18-16)+15/5;结果8+3=11
String str[]={"4","18","16","-","*","15","5","/","+"};
System.out.println("后缀表达式计算结果:"+calculate(str));
}
//后缀表达式求值
public static int calculate(String str[]){
//创建栈,存放表达式的操作数
Stack<Integer> stack = new Stack<>();
Integer op1;
Integer op2;
Integer result;
//遍历数组,判断每个字符
for (int i = 0; i < str.length; i++) {
String curr= str[i];
switch (curr){
case "+":
//判断当前字符是否是操作符,如果是,则出栈两个元素,对它们进行相应的操作,并将操作的结果入栈
op1 = stack.pop();
op2= stack.pop();
result=op2+op1;
stack.push(result);
break;
case "-":
//判断当前字符是否是操作符,如果是,则出栈两个元素,对它们进行相应的操作,并将操作的结果入栈
op1 = stack.pop();
op2= stack.pop();
result=op2-op1;
stack.push(result);
break;
case "*":
//判断当前字符是否是操作符,如果是,则出栈两个元素,对它们进行相应的操作,并将操作的结果入栈
op1 = stack.pop();
op2= stack.pop();
result=op2*op1;
stack.push(result);
break;
case "/":
//判断当前字符是否是操作符,如果是,则出栈两个元素,对它们进行相应的操作,并将操作的结果入栈
op1 = stack.pop();
op2= stack.pop();
result=op2/op1;
stack.push(result);
break;
default:
//如果不是,则将当前的操作符放入到栈中
stack.push(Integer.parseInt(curr));
break;
}
}
//遍历结束之后,栈中仅剩的一个值就是表达式的计算结果
return stack.pop();
}
}