问题概述
逆波兰表达式求值问题是我们计算机中经常遇到的一类问题,要研究明白这个问题,首先我们得搞清楚什么是逆波兰表达式。要搞清楚逆波兰表达式,我们要从中缀表达式说起。
中缀表达式
中缀表达式就是我们平常生活中使用的表达式,因为简单、易懂。中缀表达式的特点是:二元运算符总是置于两个操作数中间。
但对于计算机来说就不是这样了,因为中缀表达式的计算顺序不具有规律性。不同的运算符具有不同的优先级,如果计算机执行中缀表达式,需要解析表达式语义,做大量的优先级相关操作。所以计算机是通过逆波兰表达式对表达式进行计算的。
逆波兰表达式(后缀表达式)
逆波兰表达式特点是:运算符总是放在和它相关的操作数之后。
代码实现
package test;
import linear.Stack;
public class ReversePolishNotationTest {
public static void main(String[] args) {
String[] notation = {"3","17","15","-","*","18","6","/","+"};
int result = caculate(notation);
System.out.println("逆波兰表达式的结果为:" + result);
}
public static int caculate(String[] notation){
Stack<Integer> oprands = new Stack<>();
for(int i=0;i<notation.length;i++){
String curr = notation[i];
Integer o1,o2,result;
switch (curr){
case "+":
o1 = oprands.pop();
o2 = oprands.pop();
result = o2 + o1;
oprands.push(result);
break;
case "-":
o1 = oprands.pop();
o2 = oprands.pop();
result = o2 - o1;
oprands.push(result);
break;
case "*":
o1 = oprands.pop();
o2 = oprands.pop();
result = o2 * o1;
oprands.push(result);
break;
case "/":
o1 = oprands.pop();
o2 = oprands.pop();
result = o2 / o1;
oprands.push(result);
break;
default:
oprands.push(Integer.valueOf(curr));
break;
}
}
int result = oprands.pop();
return result;
}
}