题解 | #表达式求值#
表达式求值
https://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d
import java.util.Scanner;
import java.util.*;
/**
四则运算的解法
*/
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextLine()) {
String str = in.nextLine();
str.replace("{", "(");
str.replace("[", "(");
str.replace("}", ")");
str.replace("]", ")");
System.out.println(solve(str));
}
}
private static int solve(String str) {
Stack<Integer> stack = new Stack<>();
int n = str.length();
int num = 0;
char sign = '+';
for (int i = 0; i < n; i++) {
char ch = str.charAt(i);
if (Character.isDigit(ch)) {
num = num * 10 + ch - '0';
}
if (ch == '(') {
int count = 1;
int j = i + 1;
while (count > 0) {
if (str.charAt(j) == '(') {
count++;
}
if(str.charAt(j) == ')') {
count--;
}
j++;
}
num = solve(str.substring(i+1, j-1));
i = j - 1;
}
if (!Character.isDigit(ch) || i == n - 1) {
if (sign == '+') {
stack.push(num);
}
if (sign == '-') {
stack.push(-1 * num);
}
if (sign == '*') {
stack.push(stack.pop() * num);
}
if (sign == '/') {
stack.push(stack.pop() / num);
}
sign = ch;
num = 0;
}
}
int ans = 0;
while (!stack.isEmpty()) {
ans += stack.pop();
}
return ans;
}
}
个人感觉四则运算这道题还是蛮难的,细节会比较多。
主要是用 栈 的思想来解决,但是在实现层面,需要对数值和操作符分别进行处理,然后默认操作符是 + 这个思想很棒;另外的亮点就是 对( 的解决,主要是用了递归。
