1.面试问题
2.思路
我的思路是,拿到字符串后,先去取最后一个’(’ 然后取最后一个 ‘(’ 后的 ‘)’,也就是拿到一个小括号表达式,然后我们对表达式进行四则运算,把计算结果替换()表达式。对于 [] 的处理方式也相同。直接贴最终实现代码了。
3.具体代码
public static void main(String[] args) {
String str = "3*[(2+3)/(4+4)*5]*[(1+3)/2]";
while(str.contains("[")) {
while(str.contains("(")) {
String b = str.substring(str.lastIndexOf('(')); //拿到表达式的最后一个 (
int endnum = b.indexOf(')') + str.lastIndexOf('(');//拿到表达式的最后一个 ( 后面的 ) 就是形成一个()表达式,下标是str的下标
String inner = str.substring(str.lastIndexOf('('),endnum+1);//截取()表达式的内容
String r = inner.substring(1,inner.length()-1);//去掉()
// String r = StringUtils.strip(inner,"()");//去掉 ()
String v = String.valueOf(doCalculation(r));//计算四则运算
String newv = str.replace(inner,v);;//把结算结果替换()表达式
str = newv;
}
String b = str.substring(str.lastIndexOf('['));//思路同 处理()
int endnum = b.indexOf(']') + str.lastIndexOf('[');
String inner = str.substring(str.lastIndexOf('['),endnum+1);
String r = inner.substring(1,inner.length()-1);
String v = String.valueOf(doCalculation(r));
String newv = str.replace(inner,v);;
str = newv;
}
System.out.println(doCalculation(str));
}
private static double doCalculation(String formula) {
ArrayList<Double> values = new ArrayList<Double>();
ArrayList<String> operators = new ArrayList<String>();
int curPos = 0;
int prePos = 0;
int minus = 0;
for (char s : formula.toCharArray()) {
if ((s == '+' || s == '-' || s == '*' || s == '/') && minus !=0 && minus !=2) {
values.add(Double.parseDouble(formula.substring(prePos, curPos).trim()));
operators.add("" + s);
prePos = curPos + 1;
minus = minus +1;
}else{
minus =1;
}
curPos++;
}
values.add(Double.parseDouble(formula.substring(prePos).trim()));
char op;
for (curPos = 0; curPos <= operators.size() - 1; curPos++) {
op = operators.get(curPos).charAt(0);
switch (op) {
case '*':
values.add(curPos, values.get(curPos) * values.get(curPos + 1));
values.remove(curPos + 1);
values.remove(curPos + 1);
operators.remove(curPos);
curPos = -1;
break;
case '/':
values.add(curPos, values.get(curPos) / values.get(curPos + 1));
values.remove(curPos + 1);
values.remove(curPos + 1);
operators.remove(curPos);
curPos = -1;
break;
}
}
for (curPos = 0; curPos <= operators.size() - 1; curPos++) {
op = operators.get(curPos).charAt(0);
switch (op) {
case '+':
values.add(curPos, values.get(curPos) + values.get(curPos + 1));
values.remove(curPos + 1);
values.remove(curPos + 1);
operators.remove(curPos);
curPos = -1;
break;
case '-':
values.add(curPos, values.get(curPos) - values.get(curPos + 1));
values.remove(curPos + 1);
values.remove(curPos + 1);
operators.remove(curPos);
curPos = -1;
break;
}
}
return values.get(0).doubleValue();
}
4.计算结果
在这里插入图片描述