题解 | #表达式求值# 抽取没有括号的表达式
表达式求值
https://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d
import java.math.*;
import java.text.CharacterIterator;
import java.text.StringCharacterIterator;
import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.atomic.*;
import java.util.stream.*;
import java.util.regex.*;
import java.util.function.*;
public class Main {
static Map<String, IntBinaryOperator> OP_MAP = new
HashMap<String, IntBinaryOperator>() {
{
put("+", Integer::sum);
put("-", (a, b)->a - b);
put("*", (a, b)->a * b);
put("/", (a, b)->a / b);
}
};
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String line = in.nextLine();
if (!line.startsWith("(")) {
line = String.format("(%s)", line);
}
System.out.println(compute(line));
}
// 有括号的表达式
static int compute(String line) {
LinkedList<String> stack = new LinkedList<>();
boolean lastIsNum = false;
for (int i = 0; i < line.length();) {
char c = line.charAt(i);
if (c == '(' || c == '+' || (c == '-' && lastIsNum) || c == '*' || c == '/') {
stack.push(String.valueOf(c));
lastIsNum = false;
i++;
} else if (c == '-' || Character.isDigit(c)) {
StringBuilder sb = new StringBuilder(String.valueOf(c));
i++;
while (i < line.length() && Character.isDigit(line.charAt(i))) {
sb.append(line.charAt(i));
i++;
}
stack.push(sb.toString());
lastIsNum = true;
} else if (c == ')') {
List<String> list = new ArrayList<>();
while (!"(".equals(stack.peek())) {
list.add(stack.pop());
}
stack.pop();
Collections.reverse(list);
stack.push(String.valueOf(computeSingle(list)));
lastIsNum = true;
i++;
}
}
return Integer.parseInt(stack.pop());
}
// 没有括号的表达式。计算两遍,第一遍只计算乘除,第二遍只计算加减
static int computeSingle(List<String> list) {
// 只计算乘除
Deque<String> deque = new LinkedList<>();
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String curr = it.next();
if (!curr.equals("*") && !curr.equals("/")) {
deque.offerLast(curr);
} else {
String op = curr;
int a = Integer.parseInt(deque.pollLast());
int b = Integer.parseInt(it.next());
int result = OP_MAP.get(op).applyAsInt(a, b);
deque.offerLast(String.valueOf(result));
}
}
// 只计算加减
int result = 0;
while (!deque.isEmpty()) {
String curr = deque.pollFirst();
if (!curr.equals("+") && !curr.equals("-")) {
result = Integer.parseInt(curr);
} else {
String op = curr;
int a = result;
int b = Integer.parseInt(deque.pollFirst());
result = OP_MAP.get(op).applyAsInt(a, b);
}
}
return result;
}
}


