Search code examples
javastackpostfix-notation

Need help in implementing Java Algorithm on Postfix Evaluation


I've tried writing this code from scratch, coding, and running it but it just doesn't seem to work. This was assigned as lab work in class. The requirements are: Implementing a postfix evaluation with the use of a stack and stack operations (user-defined). I think the algorithm of my program is right, but it always gives me the wrong answer. Here is my code.

public class StackApplication {

    public static class Stack<T> {

        private int top = 0;
        private final static int stackMax=100;
        // highest index of stk array
        private Object[] stk = new Object[stackMax+1];
        //Elements must be cast back.

        public Stack() { // constructor
        }

        public boolean isEmpty(){
            if (top==0) return true;
            else return false;
        }

        public void push(T el) {
            if(top==stackMax)
                System.out.println("Stack push overflow error");
            else top=top+1;
            stk[top]=el;
        }

        public T pop(){
            if(isEmpty()){
                System.out.println("Stack push underflow error");
                return null;
            }
            else top=top-1;
            return(T)stk[top+1];
        }

        public T top(){
            if(isEmpty()){
                //System.out.println("Stack empty");
                return null;
            }
            else return (T)stk[top];
        }
    }
    public static boolean isOperator(char c){
        return(c=='+' || c=='-' || c=='/' || c=='*' || c=='^');
    }
    public static double evaluate(double x, char o, double y) {

        double result=0;
        switch(o) {
            case '+' : result=x+y; break;
            case '-' : result=x-y; break;
            case '*' : result=x*y; break;
            case '/' : result=x/y; break;
            case '^' : result=Math.pow(x, y);  break;
            default : break;    
        }
        return result;
    }

    public static void main(String[] args) {
        Scanner console=new Scanner(System.in);
        Stack<Double> s=new Stack<Double>();

        System.out.println("Input Postfix form to evaluate:");
        String inp=console.nextLine();
        char[] chararray=inp.toCharArray();
        double b,a;

        for(int i=0; i<chararray.length; i++) {
            if(!isOperator(chararray[i]))
                s.push((double)chararray[i]);
            else {
                b=s.pop();
                a=s.pop();
                double c=evaluate(a, chararray[i], b);
                s.push(c);
            }
        }
        System.out.println(" " +s.pop());
    }
}

Sample Output: Input Postfix form to evaluate:

23+ (Input)
101.0  (Output)
5.0 (Expected output) 

Solution

  • The problem is here: s.push((double)chararray[i]);. You can't convert char to double this way. You are now taking the ascii code of 2 and 3.

    50(ascii code of 2) + 51(ascii code of 3) = 101

    Do it like this: s.push((double)(chararray[i] - '0'));