中缀表达式求值:用两个栈,一个存操作符,一个存操作数。需要注意的就是,如果当前遍历到的操作符的优先级小于或者等于操作符栈的栈顶操作符,那么就需要取出栈顶操作符和两个栈顶操作数进行运算。
java满分代码
import java.util.LinkedList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
for (int i = 0; i < n; i++) {
String expression = scanner.next();
System.out.println(getResult(expression) == 24 ? "Yes" : "No");
}
scanner.close();
}
private static int getResult(String expression) {
LinkedList<Integer> numbers = new LinkedList<>();
LinkedList<Character> operators = new LinkedList<>();
int i = 0;
while (i < expression.length()) {
char ch = expression.charAt(i);
if (ch >= '1' && ch <= '9') {
numbers.push(ch - '0');
i += 1;
} else {
boolean shouldPush = true;
if (operators.size() > 0) {
char opPrev = operators.get(0);
if (shouldPop(ch, opPrev)) {
shouldPush = false;
numbers.push(getResult(numbers.pop(), numbers.pop(), operators.pop()));
}
}
if (shouldPush) {
operators.push(ch);
i += 1;
}
}
}
while (!operators.isEmpty()) {
numbers.push(getResult(numbers.pop(), numbers.pop(), operators.pop()));
}
return numbers.pop();
}
private static int getResult(int n1, int n2, char op) {
switch (op) {
case 'x':
return n1 * n2;
case '/':
return n2 / n1;
case '+':
return n1 + n2;
case '-':
return n2 - n1;
}
return -1;
}
private static boolean shouldPop(char opCurr, char opPrev) {
return !((opCurr == 'x' || opCurr == '/') && (opPrev == '+' || opPrev == '-'));
}
}