计算器(一)
https://www.nowcoder.com/practice/9b1fca7407954ba5a6f217e7c3537fed
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;
}
}