首先我们了解一下什么叫逆波兰表达式?
逆波兰式,也叫后缀表达式(即运算符写在操作数之后)
例: 9 3 /
而我们日常所用的表达式都是中缀表达式,与逆波兰式是不一样的
上述的逆波兰式可能大家已经知道了,用中缀表达式表述:9 / 3
下面我们来试试稍微复杂一点的中缀式转逆波兰式吧!!!
中缀式:
1. (2+3) / 5
2. 5 / (3+7)
3. (9+3) * 2
4. (10+3) * ((3+5) / 2)
逆波兰式:
1. 2 3 + 5 /
2. 5 3 7 + /
3. 9 3 + 2 *
4. 3 10 + 3 5 + 2 / *
发现没,所有的中缀式转逆波兰式其实是有优先级的,拿中缀式 (2+3) /5 来说转逆波兰式之后就是 2 3 + 5 /了,那么如果是 2+3/5 呢?
2+3/5的逆波兰式就是 2 3 5 / +
大家可以仔细想想为什么不一样?
是因为在 2+3/5这个表达式里,先运算的是3/5,而在(2+3) /5里,先运算的2+3。优先级不同所以最后的逆波兰式也是不一样的。
public class Main{
//逆波兰表达式求值
public static void main(String[] args) {
String[] tokens={"10","6","9","3","+","-11","*","/","*","17","+","5","+"};
int res=Integer.MAX_VALUE;
for(int i=0;i<tokens.length;i++){
int operator=isOperator(tokens[i]);
if(operator==-1)continue;
int num1=isNum(tokens,i);
int num2;
//第一次运算时,num1应与num2调换,再寻找下一位符号位更近的数字
//例: 9 3 / num1:9 num2:3 operator:/
if(res==Integer.MAX_VALUE){
num2=num1;
num1=isNum(tokens,i);
}else num2=res;
if(operator==1)res=num1+num2;
else if(operator==2)res=num1-num2;
else if(operator==3)res=num1*num2;
else if(operator==4)res=num1/num2;
}
System.out.println(res);
}
//判断是否为运算符
static int isOperator(String str){
if(str=="+")return 1;
if(str=="-")return 2;
if(str=="*")return 3;
if(str=="/")return 4;
return -1;
}
//返回离符号最近的数字
static int isNum(String[] str,int index){
while(index>=0){
if(Character.isDigit(str[index].charAt(0))){
int val= Integer.parseInt(str[index]);
str[index]=".";
return val;
}
index--;
}
return 0;
}
}