题解 | #四则运算#
四则运算
https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNext()) { // 注意 while 处理多个 case
String expr = in.next() + '$';
Deque<Integer> numStack = new ArrayDeque<>();
Deque<Character> opStack = new ArrayDeque<>();
int current = 0;
while (current != expr.length()) {
char ch = expr.charAt(current);
switch (ch) {
case '+':
case '-':
if (current == 0 || expr.charAt(current - 1) == '(' || expr.charAt(current - 1) == '['
|| expr.charAt(current - 1) == '{') {
// 解析为数字
int len = 1;
while (Character.isDigit(expr.charAt(current + len))) {
len++;
}
int num = Integer.parseInt(expr.substring(current, current + len));
numStack.push(num);
current += len;
} else {
// 解析为运算符
while (!opStack.isEmpty() && (opStack.peek() == '*' || opStack.peek() == '/'
|| opStack.peek() == '+' || opStack.peek() == '-')) {
char op = opStack.poll();
int num2 = numStack.poll();
int num1 = numStack.poll();
numStack.push(compute(num1, op, num2));
}
opStack.push(ch);
current++;
}
break;
case '*':
case '/':
while (!opStack.isEmpty() && (opStack.peek() == '*' || opStack.peek() == '/')) {
char op = opStack.poll();
int num2 = numStack.poll();
int num1 = numStack.poll();
numStack.push(compute(num1, op, num2));
}
opStack.push(ch);
current++;
break;
case '(':
case '{':
case '[':
opStack.push('(');
current++;
break;
case ')':
case '}':
case ']':
while (opStack.peek() != '(') {
char op = opStack.poll();
int num2 = numStack.poll();
int num1 = numStack.poll();
numStack.push(compute(num1, op, num2));
}
opStack.poll(); // 弹出 '('
current++;
break;
case '$':
// 结束符号
while (!opStack.isEmpty()) {
char op = opStack.poll();
int num2 = numStack.poll();
int num1 = numStack.poll();
numStack.push(compute(num1, op, num2));
}
current++;
break;
default:
// 解析数字
int len = 1;
while (Character.isDigit(expr.charAt(current + len))) {
len++;
}
int num = Integer.parseInt(expr.substring(current, current + len));
numStack.push(num);
current += len;
}
}
System.out.println(numStack.poll());
}
}
private static int compute(int num1, char op, int num2) {
switch (op) {
case '+':
return num1 + num2;
case '-':
return num1 - num2;
case '*':
return num1 * num2;
case '/':
return num1 / num2;
}
throw new RuntimeException();
}
}
