参考:《算法 (第四版)》 p79
1. 思路
创建两个栈
- 一个栈用来存储
操作符
(+,-,*,/) - 一个栈用来存储
操作数
(表达式中的数值和执行过操作的数值
) - 将左括号和空格忽略
- 每遇到一个右括号,弹出一个运算符,弹出所需数量的操作数(两个),并将运算符和操作数的结果压入操作数栈(最后栈中只会剩下一个值,该值为我们所求的结果)
2. 代码演示
public class DoubleStack {
public static void main(String[] args) {
//(1 + ((2 + 3) * (4 * 5))) = 101
String expression = "(1 + ((2 + 3) * (4 * 5)))";
System.out.println(getValue(expression));
}
private static int getValue(String expression) {
//操作符
Stack<String> ops = new Stack<>();
//值
Stack<Integer> values = new Stack<>();
for (char c : expression.toCharArray()) {
if (c == '(' || c == ' ') continue;
else if (c == '+') ops.push("+");
else if (c == '-') ops.push("-");
else if (c == '*') ops.push("*");
else if (c == '/') ops.push("/");
else if (c == ')') {
String op = ops.pop();
int value = values.pop();
if (op.equals("+")) value = values.pop() + value;
else if (op.equals("-")) value = values.pop() - value;
else if (op.equals("*")) value = values.pop() * value;
else if (op.equals("/"))value = values.pop() / value;
values.push(value);
}
else values.push(c - '0');
}
return values.pop();
}
}
加油儿!