here is the code i hve found on stack overflow but it does'nt handle brckets need help
public static int evaluateE(String s) {
//Base case
if (!s.contains("+") && !s.contains("-") && !s.contains("*") && !s.contains("/")) {
return Integer.parseInt(s);
}
here it is checking precedence first + ,- then *, / but it doesn't check for brackets and parentheses
int i;
// search for '+' and '-' first
for (i = s.length() - 1; i >= 0; i--) {
if (s.charAt(i) == '+' || s.charAt(i) == '-') {
break;
}
}
if (i < 0) {
// if '+' and '-' were not found, search for '*' and '/'
for (i = s.length() - 1; i >= 0; i--) {
if (s.charAt(i) == '*' || s.charAt(i) == '/') {
break;
}
}
}
String r1 = s.substring(0, i);
String r2 = s.substring(i + 1, s.length());
int result = 0;
switch (s.charAt(i)) {
case '+':
result = evaluateE(r1) + evaluateE(r2);
break;
case '-':
result = evaluateE(r1) - evaluateE(r2);
break;
case '*':
result = evaluateE(r1) * evaluateE(r2);
break;
case '/':
int right = evaluateE(r2);
if (right == 0) //if denominator is zero
{
System.out.println("Invalid divisor");
System.exit(1);
} else {
result = evaluateE(r1) / right;
}
break;
}
return result;
}
Maybe this works...
public static int evaluateE(String s) {
//Base case
if (!s.contains("+") && !s.contains("-") && !s.contains("*") && !s.contains("/")) {
return Integer.parseInt(s);
}
// iterate over string when encounter parentheses evaluate expression inside
for(int j = 0; j < s.length(); j++){
if (s.charAt(j) == ')'){
int k = j;
// go back to left parentheses
while (s.charAt(k) != '(')
k--;
String left = s.substring(0,k);
String inparen = Integer.toString(evaluateE(s.substring(k+1,j)));
String right = s.substring(j+1,s.length());
s = left + inparen + right;
j = left.length() + inparen.length()-1;
}
}
int i;
// search for '+' and '-' first
for (i = s.length() - 1; i >= 0; i--) {
if (s.charAt(i) == '+' || s.charAt(i) == '-') {
break;
}
}
if (i < 0) {
// if '+' and '-' were not found, search for '*' and '/'
for (i = s.length() - 1; i >= 0; i--) {
if (s.charAt(i) == '*' || s.charAt(i) == '/') {
break;
}
}
}
String r1 = s.substring(0, i);
String r2 = s.substring(i + 1, s.length());
int result = 0;
switch (s.charAt(i)) {
case '+':
result = evaluateE(r1) + evaluateE(r2);
break;
case '-':
result = evaluateE(r1) - evaluateE(r2);
break;
case '*':
result = evaluateE(r1) * evaluateE(r2);
break;
case '/':
int right = evaluateE(r2);
if (right == 0) {
System.out.println("Invalid divisor");
System.exit(1);
}
else result = evaluateE(r1) / right;
break;
}
return result;
}
public static void main(String[] args) {
System.out.println(evaluateE("4*(3*(6+6)+7)"));
}
in main for input of "4*(3*(6+6)+7)"
output:
172
// iterate over string when encounter parentheses evaluate expression inside
for(int j = 0; j < s.length(); j++){
if (s.charAt(j) == ')'){
int k = j;
System.out.println("k : "+k+"\n J : "+j);
// go back to left parentheses
while (s.charAt(k) != '(')
k--;
System.out.println("k : "+k+"\n J : "+j);
String left = s.substring(0,k);
String inparen = Integer.toString(evaluateE(s.substring(k+1,j)));
String right = s.substring(j+1,s.length());
s = left + inparen + right;
j = left.length() + inparen.length()-1;
}
i change the code little bit to increment the [ ] solving feature
else if (s.charAt(j) == ']'){
int k = j;
System.out.println("k : "+k+"\n J : "+j);
// go back to left parentheses
while (s.charAt(k) != '[')
k--;
System.out.println("k : "+k+"\n J : "+j);
String left = s.substring(0,k);
String inparen = Integer.toString(evaluateE(s.substring(k+1,j)));
String right = s.substring(j+1,s.length());
s = left + inparen + right;
j = left.length() + inparen.length()-1;
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.