栈(stack)
后进先出(FILO)策略的数据结构。
public class Evaluate {
public static void main(String[] args) {
System.out.println(evaluate());
}
/**
* 使用两个栈来完成表达式运算
* 表达式由括号、运算符、和操作数组成
* 将操作数压入操作数栈
* 将运算符压入运算符栈
* 忽略左括号
* 遇到右括号,弹出一个运算符,弹出所需数量的操作数,将运算结果压入操作数栈
*/
public static int evaluate() {
String expression = "( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) )";
String[] split = expression.split(" ");
Stack<String> ops = new Stack<>();
Stack<Integer> vals = new Stack<>();
List<String> opsList = new ArrayList<>(Arrays.asList("+","-","*","/"));
for (String str : split) {
if ("(".equals(str)) {
} else if (opsList.contains(str)) {
ops.push(str);
} else if (")".equals(str)) {
Integer value = vals.pop();
switch (ops.pop()) {
case "+":
value += vals.pop();
break;
case "-":
value -= vals.pop();
break;
case "*":
value *= vals.pop();
break;
default:
value /= vals.pop();
break;
}
vals.push(value);
} else {
vals.push(Integer.parseInt(str));
}
}
return vals.pop();
}
}