记牛客网一道基础算法题,栈+递归实现
描述
请写一个整数计算器,支持加减乘三种运算和括号。
数据范围:0<= |s| <= 100,保证计算结果始终在整型范围内
要求:空间复杂度: O(n),时间复杂度 O(n)
示例:
字符串:(2*(3-4))*5
计算结果:-10
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
public int solve (String s) {
// write code here
Stack<Integer> numStack = new Stack<>();
s = s.replaceAll(" ", "");
char[] chs = s.toCharArray();
char sign = '+';
int num = 0;
for(int i = 0 ; i < s.length(); i ++){
// 处理数字
if(Character.isDigit(chs[i])){
int j = i;
while(j < chs.length && Character.isDigit(chs[j])){
num = num * 10 + chs[j++] - '0';
}
i = j - 1;
}
// 先处理括号
if('(' == chs[i]){
// 括号数量,第一个左括号,数量为1,每多一个左括号,数量+1
// 直到括号数量减为0,证明最大的括号已经被找到,开始递归计算
// 如果多个括号分开成对,分别处理
int tempNum = 1;
for(int j = i + 1; j < s.length(); j++){
if(s.charAt(j) == '(') tempNum++;
if(s.charAt(j) == ')') tempNum--;
if(tempNum == 0){
num = solve(s.substring(i + 1, j));
i = j;
break;
}
}
}
// 当前是数字,不参与计算
// 遇到操作符时,将当前操作符之前的数字,进行入栈,或者乘除计算
// 加、减操作,数字直接入栈,不进行计算,因为加减优先级最低
// 将减操作转换为负数,方便最后统一按加法计算
// 乘除计算,可以将当前栈中元素弹出,进行计算,因为乘除优先
// 如果是右括号,则忽略,继续往后扫描,下一位肯定是运算符
if(!Character.isDigit(chs[i]) || i == chs.length - 1){
if(sign=='+') numStack.push(num);
else if(sign=='-') numStack.push(-1*num);
else if(sign=='*') numStack.push(numStack.pop()*num);
else if(sign=='/') numStack.push(numStack.pop()/num);
sign = chs[i];
num = 0;
}
}
int result = 0;
// 将栈中的元素进行加法计算
while(!numStack.isEmpty()){
result += numStack.pop();
}
return result;
}
}