牛客地址
解题思路
初始化sign = '+'
遍历字符数组(while i < cArray.length):
如果为运算符,则用其更新sign符号,continue
否则:(需要计算待加入栈中的num值, 有以下两种情况)
如果当前c = '(', 则找到其对应的配置的')’处j,递归调用函数 num = solve(i + 1, j), i = j +1;
否则:i一直++,直到彻底得到一个完整的数字 num
根据之前的sign为;对应得往栈中添加合理的数据。
为'-',则添加 (-1) * num; 为‘'’, 则添加stack.pop() * num;为'/',则添加stack.pop() / num;默认直接添加num
将栈中所有的元素进行相加即可
实现代码
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
public int solve (String s) {
// write code here
if(s == null || "".equals(s)){
return 0;
}
char[] cArr = s.toCharArray();
Stack<Integer> stack = new Stack<>();
int i = 0;
char sign = '+';
while(i < cArr.length){
char c = cArr[i];
if(c == '+' || c == '-' || c == '*' || c == '/'){
//找下一个数字
i ++;
sign = c;
continue;
}
int num = 0;
if(c == '('){
int count = 1;
int j = i;
while(j < cArr.length && count > 0){
j ++;
if(cArr[j] == ')'){
count --;
}
else if(cArr[j] == '('){
count ++;
}
}
num = solve(s.substring(i + 1, j));
System.out.println(num);
i = j + 1;
}
else{
//处理数字
num = 0;
while(i < cArr.length && Character.isDigit(cArr[i])){
num = num * 10 + cArr[i] - '0';
i ++;
}
}
switch(sign){
case '-':
num = (-1) * num;
break;
case '*':
num = num * stack.pop();
break;
case '/':
num = stack.pop() / num;
break;
default:
break;
}
stack.push(num);
}
int sum = 0;
while(!stack.isEmpty()){
sum += stack.pop();
}
return sum;
}
}