题解 | #表达式求值#
表达式求值
https://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d
解题思路的关键在于:
当判断到该字符为运算符号时,将该运算符号之前的数字按上一个运算符号push到stack中。此次判断得到的运算符号,将用作下一个位置数字的push。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String input = scan.nextLine();
//替换括号为小括号"()"
input.replace("{", "(");
input.replace("}", "(");
input.replace("[", "(");
input.replace("]", "(");
//输出结果
System.out.println(solve(input));
}
public static int solve(String input) {
Stack<Integer> stack = new Stack<>(); //将每个求和数放入栈中
char[] chars = input.toCharArray();
int n = chars.length;
int num = 0; //初始化数字
char sign = '+'; //初始化+号,保证第一个数字的输入
//逐字符进行判断
for (int i = 0; i < n; i++) {
char item = chars[i];
//如果为空字符
if (item == ' ') continue;
//如果为数字
if (Character.isDigit(item)) {
num = num * 10 + item - '0';
}
//如果为括号,则明确括号位置,将括号内容进行solve求解,并将指针放到括号外
if (item == '(') {
int count = 1; //统计括号的次数,以此判定括号是否结束
int j = i + 1;
while (count > 0) {
if (chars[j] == '(') count++;
if (chars[j] == ')') count--;
j++;
}
//已明确括号的位置为i,j-1
num = solve(input.substring(i + 1, j - 1));
//得到括号内的结果后,调整指针位置
i = j - 1;
}
//如果不为数字和括号,则判断具体的法则
if (item == '+' || item == '-' || item == '*' || item == '/' || i == n - 1) {
if (sign == '+') {
stack.push(num);
} else if (sign == '-') {
stack.push(-1 * num);
} else if (sign == '*') {
stack.push(stack.pop() * num);
} else if (sign == '/') {
stack.push(stack.pop() / num);
}
//将求和数填充入stack中后,需要更新加减乘除
sign = item;
//运行过一次运算后,将num刷新,防止下一个数字num=num*10+item-'0'有影响
num = 0;
}
}
int sum = 0;
while (!stack.empty()) {
sum += stack.pop();
}
return sum;
}
}