I have this homework in Java where I have to convert an infix string without parenthesis to a postfix string. I've been tinkering with the code from two days but I haven't been able to catch the bug. Here's my code.
public class itp
{
    String exp, post;
    double res;
    int l;
    stack st;
    public itp(String s)
    {
        exp = s;
        post = "";
        l = exp.length();
        st = new stack(l);
        conv();
        calc();
        System.out.println("The postfix notation of "+exp+" is "+post);
        System.out.println("The result of "+exp+" is "+res);
    }
    public void conv()
    {
        char ch = ' ';
        char pre = ' ';
        for(int i =0;i<l;i++)
        {
            ch = exp.charAt(i);
            if("+-*/".indexOf(ch)==-1)post = post + ch;
            else
            {
                    pre = st.pop();
                    if(val(ch)>=val(pre))
                    {
                        st.push(pre);
                        st.push(ch);
                    }
                    else
                    {
                        while((val(ch)<=val(pre))&&(pre!='$'))
                        {
                            post = post + pre;
                            pre = st.pop();
                        }
                        st.push(ch);
                    }
            }
        }
        for(pre = st.pop();pre!='$';pre = st.pop())
        {
            post = post + pre;
        }
    }
    public void calc()
    {
        res = 0.0;
    }
    public int val(char c)
    {
        switch(c)
        {
            case '$' : return 0;
            case '+' : return 1;
            case '-' : return 2;
            case '*' : return 3;
            case '/' : return 4;
             default : return -1;
        }
    }
}
Here, the variables are as follows:
- stis a character stack
- chis the current character
- preis the topmost char on the stack
- expis the input infix expression
- postis the output postfix expression
The pop() methods works as expected except when the stack is empty, where it will return $. The function val() takes a char input and returns 4 for /, 3 for *. 2 for -. 1 for +. The integer l holds the length of exp.
It works well in most cases except when I give it a string like a*b-b*c+c*d-d*e where it outputs ab*bc*-cd*de*- which is the expected output without a + in the end.
Any advice would be much appreciated. This bug is making me crazy!
Here's the entire code:
public class itp
{
String exp, post;
double res;
int l;
stack st;
public itp(String s)
{
    exp = s;
    post = "";
    l = exp.length();
    st = new stack(l);
    conv();
    calc();
    System.out.println("The postfix notation of "+exp+" is "+post);
    System.out.println("The result of "+exp+" is "+res);
}
public void conv()
{
    char ch = ' ';
    char pre = ' ';
    for(int i =0;i<l;i++)
    {
        ch = exp.charAt(i);
        if("+-*/".indexOf(ch)==-1)post = post + ch;
        else
        {
                pre = st.pop();
                if(val(ch)>=val(pre))
                {
                    st.push(pre);
                    st.push(ch);
                }
                else
                {
                    while((val(ch)<=val(pre))&&(pre!='$'))
                    {
                        post = post + pre;
                        pre = st.pop();
                    }
                    st.push(ch);
                }
        }
    }
    for(pre = st.pop();pre!='$';pre = st.pop())
    {
        post = post + pre;
    }
}
public void calc()
{
    res = 0.0;
}
public int val(char c)
{
    switch(c)
    {
        case '$' : return 0;
        case '+' : return 1;
        case '-' : return 2;
        case '*' : return 3;
        case '/' : return 4;
         default : return -1;
    }
}
}
here's the stack class:
public class stack
{
char[] a;
int top,size;
public stack(int s)
{
    size = s;
    a = new char[size];
    top = -1;
}
public void push(char el)
{
    a[++top] = el;
}
public char pop()
{
    if(empty()) return '$';
    else return a[top--];
}
public boolean empty()
{
    return (top == -1);
}
}
Here's the main class
import java.util.Scanner;
class client
{
public static void main(String args[])
{
    System.out.println("Enter the expression");
    Scanner in = new Scanner(System.in);
    itp i = new itp(in.next());
}
}
 
     
    