什么是逆波兰表达式?
逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,所以,这种表示法也称为中缀表示。波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法。按此方法,每一运算符都置于其运算对象之后,故称为后缀表示。
例如:逆波兰表达式 4 7 5 - / 解析成普通的算数表达式为4/(7-5)结果为2
12 3 4 + * 6 - 8 2 / + --> 12*(3+4)-6+(8/2)
例:输入字符串(逆波兰表达式),字符串由"+”、"-"、"*"、"/"以及数字组成。计算表达式结果?
这里,我们利用栈能很好地解决这一问题:
public static int polen(String str){
String[] arr = str.split(" ");
Stack<Integer> s = new Stack<>();
for(int i=0; i<arr.length; i++){
if(arr[i].equals("+") || arr[i].equals("-") ||
arr[i].equals("*") || arr[i].equals("/")){
int right = s.pop();//右操作数
int left = s.pop();//左操作数
switch(arr[i]){
case "+":
s.push(left + right);
break;
case "-":
s.push(left - right);
break;
case "*":
s.push(left * right);
break;
case "/":
s.push(left / right);
break;
default:
break;
}
}else{
int num = Integer.parseInt(arr[i]);//String->int
s.push(num);//将数字压栈
}
}
return s.pop();
}
测试一下:
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
System.out.println(polen(str));
}