E1516 Add a remainder operator to the expression calculator

E15.16 Add a % (remainder) operator to the expression calculator of Section 15.6.3.

package collections;

import java.util.Scanner;
import java.util.Stack;

public class ExpressionCalculator {
    public static void main(String[] args) {
        Scanner consoleIn = new Scanner(System.in);
        System.out.println(\"Enter an expression: \");
        String expression = consoleIn.nextLine().replaceAll(\"\\\\s+\", \"\");
        consoleIn.close();

        Stack<Integer> numstack = new Stack<Integer>();
        Stack<Character> opstack = new Stack<Character>();
        int pos = 0;
        while (pos < expression.length()) {
            char ch = expression.charAt(pos);
            pos += 1;
            if (isOperator(ch)) {
                if (opstack.size() == 0) {
                    opstack.push(ch);
                } else {
                    char previousOp = opstack.pop();
                    if (precedence(ch) > precedence(previousOp)) {
                        opstack.push(previousOp);
                    } else {
                        evaluateTop(numstack, previousOp);
                    }
                    opstack.push(ch);
                }
            } else if (ch == \'(\') {
                opstack.push(ch);
            } else if (ch == \')\') {
                boolean done = false;
                while (!done) {
                    if (opstack.size() == 0) {
                        printError(\"No matching\");
                    }
                    char previousOp = opstack.pop();
                    if (previousOp == \'(\') {
                        done = true;
                    } else {
                        evaluateTop(numstack, previousOp);
                    }
                }
            } else if (Character.isDigit(ch)) {
                int start = pos - 1;
                while (pos < expression.length() && Character.isDigit(expression.charAt(pos))) {
                    pos += 1;
                }
                String number = expression.substring(start, pos);
                numstack.push(Integer.parseInt(number));
            } else {
                printError(\"Number, operator or parenthesis expected.\");
            }
        }
        while (opstack.size() > 0) {
            char previousOp = opstack.pop();
            if (previousOp == \'(\') {
                printError(\"No matching\");
            } else {
                evaluateTop(numstack, previousOp);
            }
        }
        if (numstack.size() == 0) {
            printError(\"Invalid expression\");
        }
        System.out.println(numstack.pop());
        if (numstack.size() > 0) {
            printError(\"Invalid expression\");
        }
    }

    public static boolean isOperator(char ch) {
        return ch == \'+\' || ch == \'-\' || ch == \'*\' || ch == \'/\';
    }

    public static void printError(String message) {
        System.out.println(\"ERROR! \" + message);
        System.exit(1);
    }

    public static int precedence(char ch) {
        if (ch == \'+\' || ch == \'-\') {
            return 1;
        } else if (ch == \'*\' || ch == \'/\') {
            return 2;
        } else {
            return 0;
        }
    }

    public static void evaluateTop(Stack<Integer> stack, char operator) {
        if (stack.size() == 0) {
            printError(\"Invalid expression\");
        }
        int y = stack.pop();
        if (stack.size() == 0) {
            printError(\"Invalid expression\");
        }
        int x = stack.pop();
        int z = 0;
        if (operator == \'*\') {
            z = x * y;
        } else if (operator == \'/\') {
            if (y == 0) {
                printError(\"Divide by 0\");
            } else {
                z = x / y;
            }
        } else if (operator == \'+\') {
            z = x + y;
        } else if (operator == \'-\') {
            z = x - y;
        } else {
            printError(\"Syntax error\");
        }
        stack.push(z);
    }
}

Solution

package collections;

import java.util.Scanner;

import java.util.Stack;

public class ExpressionCalculator {
public static void main(String[] args) {
Scanner consoleIn = new Scanner(System.in);
System.out.println(\"Enter an expression: \");
String expression = consoleIn.nextLine().replaceAll(\"\\\\s+\", \"\");
consoleIn.close();

Stack<Integer> numstack = new Stack<Integer>();
Stack<Character> opstack = new Stack<Character>();
int pos = 0;
while (pos < expression.length()) {
char ch = expression.charAt(pos);
pos += 1;
if (isOperator(ch)) {
if (opstack.size() == 0) {
opstack.push(ch);
} else {
char previousOp = opstack.pop();
if (precedence(ch) > precedence(previousOp)) {
opstack.push(previousOp);
} else { evaluateTop(numstack, previousOp);
}
opstack.push(ch);
}
} else if (ch == \'(\') {
opstack.push(ch);
} else if (ch == \')\') {
boolean done = false;
while (!done) {
if (opstack.size() == 0) {
printError(\"No matching\");
}
char previousOp = opstack.pop();
if (previousOp == \'(\') {
done = true;
} else {
evaluateTop(numstack, previousOp);
}
}
} else if (Character.isDigit(ch)) {
int start = pos - 1;
while (pos < expression.length() && Character.isDigit(expression.charAt(pos))) {
pos += 1;
} String number = expression.substring(start, pos);
numstack.push(Integer.parseInt(number));
} else {
printError(\"Number, operator or parenthesis expected.\");
}
}
while (opstack.size() > 0) {
char previousOp = opstack.pop();
if (previousOp == \'(\') {
printError(\"No matching\");
} else {
evaluateTop(numstack, previousOp);
}
}
if (numstack.size() == 0) {
printError(\"Invalid expression\");
}
System.out.println(numstack.pop());
if (numstack.size() > 0) {
printError(\"Invalid expression\");
}
}

public static boolean isOperator(char ch) {
return ch == \'+\' || ch == \'-\' || ch == \'*\' || ch == \'/\' || ch == \'%\';
}

public static void printError(String message) { System.out.println(\"ERROR! \" + message);
System.exit(1);
}

public static int precedence(char ch) {
if (ch == \'+\' || ch == \'-\') {
return 1;
} else if (ch == \'*\' || ch == \'/\' || ch == \'%\') {
return 2;
} else {
return 0;
}
}

public static void evaluateTop(Stack<Integer> stack, char operator) {
if (stack.size() == 0) {
printError(\"Invalid expression\");
}
int y = stack.pop();
if (stack.size() == 0) {
printError(\"Invalid expression\");
}
int x = stack.pop();
int z = 0;
if (operator == \'*\') {
z = x * y;
} else if (operator == \'/\') {
if (y == 0) {
printError(\"Divide by 0\");
} else {
z = x / y;
}
} else if (operator == \'+\') {
z = x + y; } else if (operator == \'-\') {
z = x - y;
}
else if(operator==\'%\')
{
z=x%y;
}
else {
printError(\"Syntax error\");
}
stack.push(z);
}
}

E15.16 Add a % (remainder) operator to the expression calculator of Section 15.6.3. package collections; import java.util.Scanner; import java.util.Stack; publi
E15.16 Add a % (remainder) operator to the expression calculator of Section 15.6.3. package collections; import java.util.Scanner; import java.util.Stack; publi
E15.16 Add a % (remainder) operator to the expression calculator of Section 15.6.3. package collections; import java.util.Scanner; import java.util.Stack; publi
E15.16 Add a % (remainder) operator to the expression calculator of Section 15.6.3. package collections; import java.util.Scanner; import java.util.Stack; publi

Get Help Now

Submit a Take Down Notice

Tutor
Tutor: Dr Jack
Most rated tutor on our site