import java.util.*; /** * NC240 计算器(一) * @author d3y1 */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param s string字符串 * @return int整型 */ public int calculate (String s) { return solution(s); } /** * 递归: 栈 * @param mathStr * @return */ private static int solution(String mathStr) { Stack<Integer> stack = new Stack<>(); int len = mathStr.length(); char[] chars = mathStr.toCharArray(); // 初始化符号为'+' char sign = '+'; // 记录数字 int number = 0; for (int i = 0; i < len; i++) { char aChar = chars[i]; // 1 当前字符是数字 拼数字 if (Character.isDigit(aChar)) { number = number * 10 + aChar - '0'; } // 2 当前字符是小括号 if (aChar == '(') { // 移到小括号后一位字符 int j = i + 1; // 统计小括号的数量 int count = 1; while (count > 0) { // 遇到右括号 括号数-1 if (chars[j] == ')') { count--; } // 遇到左括号 括号数+1 if (chars[j] == '(') { count++; } j++; } // 递归 解小括号中的表达式 number = solution(mathStr.substring(i + 1, j - 1)); i = j - 1; } // 3 当前字符是运算符号 将数字处理后放进栈 if (!Character.isDigit(aChar) || i == len - 1) { // '+' 直接入栈 if (sign == '+') { stack.push(number); } // '-' 数字取反数再入栈 else if (sign == '-') { stack.push(-1 * number); } // // '*' 弹出一个数字相乘后再放入栈 // else if (sign == '*') { // stack.push(stack.pop() * number); // } // // '/' 弹出一个数字相除后再放入栈 // else if (sign == '/') { // stack.push(stack.pop() / number); // } // 更新符号 sign = aChar; // 刷新数字 number = 0; } } // 栈中数字求和得到结果 int ans = 0; while (!stack.isEmpty()) { ans += stack.pop(); } return ans; } }