Can someone debug this code please? public class MathCalculator { String exp; in
ID: 3728115 • Letter: C
Question
Can someone debug this code please?
public class MathCalculator {
String exp;
int result;
public MathCalculator()
{
exp = " ";
result = 0;
}
public void evaluate(String ev)
{
Stack<Character> cStack = new Stack<Character>();
Stack<Integer> iStack = new Stack<Integer>();
exp = ev;
int index = 0;
while(index < ev.length())
{
if(Character.isDigit(ev.charAt(index)))
{
String temp = "";
while(Character.isDigit(ev.charAt(index)))
{
temp += ev.charAt(index);
index++;
}
iStack.push(Integer.parseInt(temp));
}
else if(ev.charAt(index) == '(')
{
cStack.push(ev.charAt(index));
index++;
}
else if(ev.charAt(index) == ')')
{
while(ev.charAt(index) != '(')
{
calculate(cStack, iStack);
cStack.pop();
index++;
}
}
else if(isOperator(ev.charAt(index)))
{
if(cStack.lookUp() >= priorityOperator(ev.charAt(index)));
{
calculate(cStack, iStack);
}
else
{
cStack.push(ev.charAt(index));
}
}
}
}
private void calculate(Stack<Character> cStack, Stack<Integer> iStack)
{
int x1, x2, result = 0;
char operator;
x2 = iStack.pop();
x1 = iStack.pop();
operator = cStack.pop();
switch(operator)
{
case '^':
{
result = (int) Math.pow(x1,x2);
break;
}
case '*':
{
result = x1 * x2;
break;
}
case '/':
{
result = x1 / x2;
break;
}
case '%':
{
result = x1 % x2;
break;
}
case '+':
{
result = x1 + x2;
break;
}
case '-':
{
result = x1 - x2;
break;
}
default:
{
System.out.println("Error: unknown operator" + operator);
}
}
iStack.push(result);
}
private boolean isOperator(char ch)
{
switch(ch)
{
case '^': case '*': case '/': case '%': case '+': case '-': return true;
default: return false;
}
}
private int priorityOperator(char ch)
{
int value = 0;
switch(ch)
{
case '^':
{
value = 2;
break;
}
case '*':
{
value = 2;
break;
}
case '/':
{
value = 2;
break;
}
case '%':
{
value = 2;
}
case '+':
{
value = 1;
break;
}
case '-':
{
value = 1;
break;
}
default:
{
System.out.println("Error: unknown operator" + ch);
}
}
/*
if(ch == '^' || ch == '*' || ch == '/' || ch == '%')
{
value = 2;
}
else if(ch == '+' || ch == '-')
{
value = 1;
}
else
{
System.out.println("Error: unknown operator" + ch);
}
*/
return value;
}
}
Explanation / Answer
Solution:
The spaces are also taken care of!
There are 9 places where I have debugged your code. I have marked these places in the code. I have also tested the code using main.java file.
MathCalculator.java
import java.util.Stack;
public class MathCalculator {
String exp;
int result;
public MathCalculator()
{
exp = " ";
result = 0;
}
public void evaluate(String ev)
{
Stack<Character> cStack = new Stack<Character>();
Stack<Integer> iStack = new Stack<Integer>();
//remove spaces from input
String tmp="";
for(int i=0;i<ev.length();i++) {
if(ev.charAt(i)==' ')
continue;
tmp=tmp+ev.charAt(i);
}
ev=tmp;
System.out.println(ev);
exp = ev;
int index = 0;
while(index < ev.length())
{
System.out.println("input char is "+ev.charAt(index));
if(Character.isDigit(ev.charAt(index)))
{
String temp = "";
//debug 7:
while(index<ev.length() && Character.isDigit(ev.charAt(index)))
{
temp += ev.charAt(index);
index++;
}
iStack.push(Integer.parseInt(temp));
}
else if(ev.charAt(index) == '(')
{
cStack.push(ev.charAt(index));
index++;
}
else if(ev.charAt(index) == ')')
{
//debug 9
while(cStack.peek() != '(')
{
calculate(cStack, iStack);
//cStack.pop(); debug1- no need to pop here,already popped out in calculate function
}
cStack.pop();//debug3 - removes '(' from stack
index++;
}
else if(isOperator(ev.charAt(index)))
{
//debug 4
while(cStack.size()>0 && cStack.peek()!='(' && priorityOperator(cStack.peek()) >= priorityOperator(ev.charAt(index))) //debug2
{
calculate(cStack, iStack);
}
cStack.push(ev.charAt(index));
index++; //debug 6
}
displayOperand(iStack);
displayOperator(cStack);
}
//debug 5 - calculates result from remaining operators and operands in the stacks
while(!cStack.isEmpty()) {
calculate(cStack, iStack);
}
//result is stored in istack
result=iStack.peek();
}
void displayOperator(Stack<Character> s) {
System.out.println("OPerator stack");
for(char ch:s) {
System.out.print(ch+" ");
}
System.out.println();
}
void displayOperand(Stack<Integer> s) {
System.out.println("OPerand stack");
for(int ch:s) {
System.out.print(ch+" ");
}
System.out.println();
}
private void calculate(Stack<Character> cStack, Stack<Integer> iStack)
{
int x1, x2, result = 0;
char operator;
x2 = iStack.pop();
x1 = iStack.pop();
operator = cStack.pop();
switch(operator)
{
case '^':
{
result = (int) Math.pow(x1,x2);
break;
}
case '*':
{
result = x1 * x2;
break;
}
case '/':
{
result = x1 / x2;
break;
}
case '%':
{
result = x1 % x2;
break;
}
case '+':
{
result = x1 + x2;
break;
}
case '-':
{
result = x1 - x2;
break;
}
default:
{
System.out.println("Error:ff unknown operator" + operator);
}
}
iStack.push(result);
}
private boolean isOperator(char ch)
{
switch(ch)
{
case '^': case '*': case '/': case '%': case '+': case '-': return true;
default: return false;
}
}
private int priorityOperator(char ch)
{
int value = 0;
switch(ch)
{
case '^':
{
value = 2;
break;
}
case '*':
{
value = 2;
break;
}
case '/':
{
value = 2;
break;
}
case '%':
{
value = 2;
//debug 8
break;
}
case '+':
{
value = 1;
break;
}
case '-':
{
value = 1;
break;
}
default:
{
System.out.println("Error: unknown operator" + ch);
}
}
/*
if(ch == '^' || ch == '*' || ch == '/' || ch == '%')
{
value = 2;
}
else if(ch == '+' || ch == '-')
{
value = 1;
}
else
{
System.out.println("Error: unknown operator" + ch);
}
*/
return value;
}
}
Main.java
public class Main {
public static void main(String[] args) {
MathCalculator m=new MathCalculator();
String exp="3*5+4/2+(4*10-(3*2+1))/3";
m.evaluate(exp);
System.out.println(m.result);
}
}
Sample input/output
input - 3*5+4/2-10%4
output - 15
input - 3*5+4/2
output-17
input - 3*5+4/2+(4*10)/3
output - 30
input - 3*5+4/2+(4*10-(3*2+1))/3
output-28
input - 3 * 6 + ( 25 - 7 * 2 ) / 10
output - 19