逆波兰表达式求值问题是我们计算机中经常遇到的一类问题,要研究明白这个问题,首先我们得搞清楚什么是逆波 兰表达式?要搞清楚逆波兰表达式,我们得从中缀表达式说起。
中缀表达式: 中缀表达式就是我们平常生活中使用的表达式,例如:1+3*2,2-(1+3)等等,中缀表达式的特点是:二元运算符总 是置于两个操作数中间。
逆波兰表达式(后缀表达式): 逆波兰表达式是波兰逻辑学家J・卢卡西维兹(J・ Lukasewicz)于1929年首先提出的一种表达式的表示方法,后缀表 达式的特点:运算符总是放在跟它相关的操作数之后。
-- 运算思想:
1、创建一个栈用于保存操作数。
2、从左往右遍历。
3、如果是数字直接入栈。
4、如果是运算符,从栈中弹出两个操作数,用当前运算符进行计算,然后将结果压栈。
5、遍历结束后,将栈中的结果弹出返回。
-- 代码:
/**
* 后缀表达式(逆波兰表达式)运算
*/
public class ReversePolishNotation {
public static void main(String[] args) {
//中缀表达式3*(17-15)+18/6的逆波兰表达式如下
String[] notation = {"3", "17", "15", "-", "*","18", "6","/","+"};
int result = caculate(notation);
System.out.println("逆波兰表达式的结果为:"+result);
}
/**
* @param notaion 逆波兰表达式的数组表示方式
* @return 逆波兰表达式的计算结果
*/
public static int caculate(String[] notaion){
// 创建一个栈存储操作数
Stack<Integer> oprands = new Stack<>();
// 从左往右遍历逆波兰表达式,得到每一个字符串
for(int i = 0;i < notaion.length;i++) {
// 拿出每个字符串
String curr = notaion[i] ;
// 判断该字符串是不是运算符,如果不是,把该操作数压入栈中
Integer o1;
Integer o2;
Integer 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.parseInt(curr));
break;
}
}
// 遍历结束后,拿出栈中的最终结果返回
return oprands.pop();
}
}
-- 运行效果图:
@ 以上内容属于个人笔记