双堆栈计算算术表达式
package algorithm;
import java.util.Stack;
public class TwoStacks {
public static void main(String[] args) {
String s = "(1+((2+3)*(4*5)))";
Double res = calculate(s);
System.out.println(res);
}
private static Double calculate(String numbers) {
// opt 保存操作符,number保存 数字
Stack<Character> opt = new Stack<>();
Stack<Double> number = new Stack<>();
char[] chars = numbers.toCharArray();
// init stacks
for (int i = 0; i < numbers.length(); i++) {
switch (chars[i]) {
case '+':
case '-':
case '*':
case '/':
opt.push(chars[i]);
break;
case '(':
break;
case ')':
Double temp;
Character operator = opt.pop();
Double num1 = number.pop();
Double num2 = number.pop();
// 运算结果压入 number stack
switch (operator) {
case '+':
temp = num1 + num2;
number.push(temp);
break;
case '-':
temp = num1 - num2;
number.push(temp);
break;
case '*':
temp = num1 * num2;
number.push(temp);
break;
case '/':
temp = num1 / num2;
number.push(temp);
break;
}
break;
default:
// 默认是'0'-'9'
Double num = Double.parseDouble(String.valueOf(chars[i]));
number.push(num);
}
}
// 此时 number stack 只有最终的运算结果。
return number.pop();
}
}
网友评论