题解 | #表达式求值#
表达式求值
https://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d
import java.util.Scanner;
import java.lang.StringBuilder;
import java.util.Stack;
import java.lang.Math;
// 注意类名必须为 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 input = in.nextLine();
int length = input.length();
Stack<Character> operator = new Stack<>(); //运算符栈
Stack<Integer> number = new Stack<>(); //操作数栈
for (int i = 0; i < length; i++) {
char temp = input.charAt(i);
if (temp == '(') { //左括号直接入栈
operator.push(temp);
} else if (temp == ')') {
while (operator.peek() != '(' && !operator.empty()) { //右括号出栈栈顶运算符,直至遇到左括号为止
int num1 = number.pop();
int num2 = number.pop();
int result = arithmetic(num1, num2, operator.pop());
number.push(result);
}
operator.pop();
} else if (temp == '+' || temp == '-') {//加减号只有遇到左括号或者栈空入栈,栈顶为其余运算符时均出栈
if (operator.empty()) {
operator.push(temp);
} else if (!operator.empty() && (operator.peek() == '(')) {
operator.push(temp);
} else {
while(!operator.empty()&&(operator.peek() == '*'||operator.peek() == '/'||operator.peek() == '+'||operator.peek() == '-')){
int num1 = number.pop();
int num2 = number.pop();
int result = arithmetic(num1,num2,operator.pop());
number.push(result);
}
operator.push(temp);
}
} else if (temp == '*' || temp == '/') {//乘除号遇到加减号,左括号,栈空时入栈,遇到乘除号时出栈栈顶元素
if (operator.empty()) {
operator.push(temp);
} else if (!operator.empty() && ( operator.peek() == '(' || operator.peek() == '+' || operator.peek() == '-')) {
operator.push(temp);
} else{
while(!operator.empty()&&(operator.peek() == '*'||operator.peek() == '/')){
int num1 = number.pop();
int num2 = number.pop();
int result = arithmetic(num1,num2,operator.pop());
number.push(result);
}
operator.push(temp);
}
} else if(Character.isDigit(temp)){
StringBuilder sb = new StringBuilder();
boolean isNegative = false;//判断是否是负数
if(i-1 == 0&&input.charAt(i-1) == '-'){
isNegative = true;
operator.pop();
}else if(i-1 > 0 && i-2 > 0&&input.charAt(i-1) == '-'&&input.charAt(i-2) == '('){
isNegative = true;
operator.pop();
}
while(Character.isDigit(input.charAt(i))){//合并数字
sb.append(input.charAt(i));
if(i < length - 1 && Character.isDigit(input.charAt(i+1))){
i++;
}else{
break;
}
}
Integer tempNumber = Integer.valueOf(sb.toString());
//System.out.println(tempNumber);
if(isNegative == true){
tempNumber = -tempNumber;
isNegative = false;
}
number.push(tempNumber);
}
}
while(!operator.empty()){ //所有字符都经过入栈操作后将运算符栈全都出栈
int num1 = number.pop();
int num2 = number.pop();
char op = operator.pop();
int result = arithmetic(num1,num2,op);
number.push(result);
}
System.out.println(number.pop());
return;
}
}
public static int arithmetic(int n1,int n2,char op){
switch(op){
case '+':
return n2+n1;
case '-':
return n2-n1;
case '*':
return n2*n1;
case '/':
return n2/n1;
}
return 0;
}
}


