题解 | #四则运算#
四则运算
https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e
import java.math.BigDecimal;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static final Map<Character, Integer> PRIORITY_MAP = new
HashMap<Character, Integer>() {
{
put('(', 0);
put('+', 1);
put('-', 1);
put('*', 2);
put('/', 2);
put(')', 3);
}
};
public static boolean priorityCompare(Character op1, Character op2) {
return (PRIORITY_MAP.get(op1) - PRIORITY_MAP.get(op2)) <= 0;
}
public static BigDecimal compute(Character operator, BigDecimal num1,
BigDecimal num2) {
BigDecimal result = new BigDecimal(0);
switch (operator) {
case '+':
result = num2.add(num1);
break;
case '-':
result = num2.subtract(num1);
break;
case '*':
result = num2.multiply(num1);
break;
case '/':
result = num2.divide(num1);
break;
default:
break;
}
return result;
}
public static void stackOperate(Deque opStack, Deque numStack) {
Character operator = (Character) opStack.pop();
BigDecimal num1 = (BigDecimal) numStack.pop();
BigDecimal num2 = (BigDecimal) numStack.pop();
BigDecimal result = compute(operator, num1, num2);
numStack.push(result);
}
public static BigDecimal calculate(char[] exp) {
Deque<Character> opStack = new ArrayDeque<>();
Deque<BigDecimal> numStack = new ArrayDeque<>();
StringBuilder numBuilder = new StringBuilder();
for (int i = 0; i < exp.length; ++i) {
Character c = exp[i];
if ((c >= '0' && c <= '9') || c == '.' || (c == '-' && i == 0) || (c == '-' &&
exp[i - 1] == '(')) {
numBuilder.append(c);
} else {
if (numBuilder.length() > 0) {
numStack.push(new BigDecimal(numBuilder.toString()));
numBuilder.delete(0, numBuilder.length());
}
if (opStack.isEmpty()) {
opStack.push(c);
} else {
if (c == '(') {
opStack.push(c);
} else if (c == ')') {
while (opStack.peek() != '(') {
stackOperate(opStack, numStack);
}
opStack.pop();
} else {
do {
if (priorityCompare(c, opStack.peek())) {
stackOperate(opStack, numStack);
if (opStack.isEmpty()) {
opStack.push(c);
break;
}
} else {
opStack.push(c);
break;
}
} while (!opStack.isEmpty());
}
}
}
}
if (numBuilder.length() > 0) {
numStack.push(new BigDecimal(numBuilder.toString()));
}
while (!opStack.isEmpty()) {
stackOperate(opStack, numStack);
}
return numStack.pop();
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNext()) { // 注意 while 处理多个 case
char[] exp = in.nextLine().replace("[", "(").replace("{", "(").replace("]",
")").replace("}", ")").toCharArray();
System.out.println(calculate(exp));
}
}
}
查看2道真题和解析