该篇中表达式运算(加减乘除 取余 幂运算),包括小数,带有各种英文括号,以及多余符号的去除,有关的原理也可以参照上一篇文章.
一.后缀表达式
(1) 简介:
又称逆波兰式,指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则),使用中缀表达式符合人的思维习惯,但是后缀表达式便于计算机.
因此,我们将中缀表达式转换为后缀表达式在作计算.
(2) 后缀表达式求值
思路:
设置一个栈.遍历表达式.
- 如果遇到操作数,压入栈中
- 如果遇到运算符,从栈顶弹出两个操作符并且做运算,运算结果压入栈中.
- 栈中最后留下的数就是最终的结果.
举例: 4 5 * 8 - 60 + 8 2 / +
- 操作数压入栈中,因此,4 和 5压入栈中
- 遇到运算符*号,从栈中弹出两个操作数,进行运算,结果压入栈中,弹出4和5,结果20压栈.
- 遇到8压栈
- 遇到 - 号,计算,得到结果 12 压入栈中
- 遇到60 压入栈中
- 遇到 + 号,计算得到结果72
- 8 和 2压入栈中
- / ,弹出8 和 2,计算得到4,压入栈中
- +, 弹出72 和 4 ,计算,得到76
- 最终结果为76
(3) 后缀表达式求值代码实现
private static float calculate(List<String> s) {
Stack<String> stack = new Stack<>();
for (String it : s) {
// 如果为操作数,直接入栈
if (it.matches("[1-9]\\d*\\.?\\d*")) {
stack.push(it);
} else {
// 如果为运算符,则从栈顶弹出两个操作数,并进行运算,将结果压入栈中
float num1 = Float.parseFloat(stack.pop());
float num2 = Float.parseFloat(stack.pop());
float res = 0;
switch (it) {
case "+": {
res = num1 + num2;
break;
}
case "-": {
res = num2 - num1;
break;
}
case "*": {
res = num2 * num1;
break;
}
case "/": {
res = num2 / num1;
break;
}
case "%": {
res = num2 % num1;
break;
}
case "^": {
res = 1;
for (int i = 1; i <= num1; i++) {
res *= num2;
}