题目
请写一个整数计算器,支持加减乘三种运算和括号。
数据范围:0≤∣s∣≤100,保证计算结果始终在整型范围内。
要求:空间复杂度: O(n),时间复杂度 O(n)。
示例1
输入:"1+2"
返回值:3
示例2
输入:"(2*(3-4))*5"
返回值:-10
示例3
输入:"3+2*3*4-1"
返回值:26
代码
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
public int solve (String s) {
// 去掉空格并将内容放入字符数组
char[] arr = s.replaceAll(" ", "").toCharArray();
Stack<Integer> stack = new Stack<>();
int num = 0;
// 初始化符号位
char sign = '+';
for (int i = 0; i < arr.length; i++) {
// 若为数字则修改num值
char c = arr[i];
if (Character.isDigit(c)) {
num = 10 * num + c - '0';
}
// 若遇到括号则找到成对的另一个括号然后对里面的表达式进行递归求值
if (c == '(') {
// 由于括号里面可能还有括号,所以利用一个标志位可以找到匹配的括号
int flg = 1;
int j = i + 1;
while (flg > 0) {
if (arr[j] == '(') {
flg++;
}
if (arr[j] == ')') {
flg--;
}
j++;
}
num = solve(s.substring(i + 1, j - 1));
// 此时j位于右括号的右边,由于for循环本身就有i++,所以这里让i = j -1即可
i = j - 1;
}
// 由于遇到运算符时将前面的数加入栈中,所以表达式最后一个数也需要进入条件进行入栈
if (!Character.isDigit(c) || i == arr.length - 1) {
// 遇到运算符时就将前面的数字加到栈中并将符号位改成当前符号位同时将num置为0
if (sign == '+') {
stack.push(num);
} else if (sign == '-') {
// 遇到负号取相反值再放入栈中
stack.push(-num);
} else if (sign == '*') {
// 遇到乘法就直接进行运算再将结果放入栈中
stack.push(stack.pop() * num);
}
num = 0;
sign = c;
}
}
int ret = 0;
while (!stack.isEmpty()) {
// 由于在前面处理过,这里只需要将每个数相加就是最终结果
ret += stack.pop();
}
return ret;
}
}