What can I improve? Is there anything you would recommend me to change to optimize my program?
public static String evaluate(String expression) {
char[] tokens = expression.toCharArray();
List<String> stacklist = new ArrayList<>();
String s = "";
String operator = "";
String firstNum = "";
String secondNum = "";
boolean operationOnQueue = false;
for (int i = 0; i < tokens.length; i++) {
if (Character.isDigit(tokens[i])) {
s += Character.toString(tokens[i]);
} else {
stack list.add(s);
stack list.add(Character.toString(tokens[i]));
s if (operationOnQueue) {
operationOnQueue = "";false;
} secondNum = s;
if (i == tokens.length - 1 && s list.lengthset(list.lastIndexOf(firstNum), >eval(firstNum, 0)operator, {secondNum));
stack list.addremove(slist.lastIndexOf(operator));
}
if (Character.isDigit(tokens[i]) && stack list.sizeremove(list.lastIndexOf(secondNum) > 4) {;
String a, b, num1, num2;}
if (itokens[i] <== tokens.length'*' -|| 1tokens[i] == '/') {
a = stack.get(stack.size() - 5);operationOnQueue = true;
b operator = stack.get(stackCharacter.sizetoString() - 3tokens[i]);
num1 firstNum = stacklist.get(stacklist.sizelastIndexOf(operator) - 41);
num2}
= stack.get(stack.size() - 2);
}s else= {"";
}
a = stack.get if (stacki == tokens.sizelength - 1 && s.length() -> 40) {
list.add(s);
bif =(list.get(list.size() stack- 2).equals("*") || list.get(stacklist.size() - 2);.equals("/")) {
num1 firstNum = stacklist.get(stacklist.size() - 3);
num2 operator = stacklist.get(stacklist.size() - 12);
}
secondNum if= list.get(hasPrecedencelist.size(b, a)) {- 1);
stack list.set(stacklist.indexOfsize(num1) - 3, eval(num1firstNum, num2operator, bsecondNum));
} else { list.remove(list.size() - 2);
stack list.setremove(stacklist.indexOfsize(num1), eval(num1, num2,- a)1);
}
}
}
stack.remove while (stacklist.lastIndexOfsize(b) > 1); {
stack.remove(stackfirstNum = list.lastIndexOfget(num2)0);
}
}
operator = list.get(1);
String ans secondNum = eval(stacklist.get(02),;
stack list.getset(2)0, stack.geteval(1firstNum, operator, secondNum));
return ans;
}
public boolean hasPrecedence(String a, String b) { list.remove(2);
return (a.equals("*") || a.equals("/")) && (b list.equalsremove("+"1);
|| b }
return list.equalsget("-")0);
}
public static String eval(String a, String boperator, String operatorb) {
double r = 0;
switch (operator) {
case "/":
r += Double.parseDouble(a) / Double.parseDouble(b);
break;
case "*":
r += Double.parseDouble(a) * Double.parseDouble(b);
break;
case "-":
r += Double.parseDouble(a) - Double.parseDouble(b);
break;
case "+":
r += Double.parseDouble(a) + Double.parseDouble(b);
break;
}
return Double.toString(r);
}
These are the results of my tests. The first line is the string inputted, along with the answer to the expression. The second line is the output of the program.
8+4/2+10*3+5*10 = 90
90.0
60*60+8+384/7/4-44*26 = 2477.71
2477.714285714286
64/16*18-51*7+5 = -280
-280.0
64/16*18-5100*7+5 = -35623
-35623.0
7325+92+44/4+57-84 = 7401
7401.0
14+54/9+1 = 21
21.0
7*4/7+9+12*3 = 49
49.0