Advertisement

Infix expression to postfix form


#insclude<iostream>
#include<stack>
#include<string>

using namespace std;

string InfixToPostfix(string expression);

int HasHigherPrecedence(char operator1, char operator2);
bool IsOperator(char C);

bool IsOperand(char C);

int main()
{
            string expression;
            cout<<"Enter Infix Expression \n";
            getline(cin,expression);
            string postfix = InfixToPostfix(expression);
            cout<<"Output = "<<postfix<<"\n";
}
string InfixToPostfix(string expression)
{
            stack<char> S;
            string postfix = "";
            for(int i = 0;i< expression.length();i++) {

             
                        if(expression[i] == ' ' || expression[i] == ',') continue;

           
                        else if(IsOperator(expression[i]))
                        {
                                    while(!S.empty() && S.top() != '(' && HasHigherPrecedence(S.top(),expression[i]))
                                    {
                                                postfix+= S.top();
                                                S.pop();
                                    }
                                    S.push(expression[i]);
                        }
                        else if(IsOperand(expression[i]))
                        {
                                    postfix +=expression[i];
                        }

                        else if (expression[i] == '(')
                        {
                                    S.push(expression[i]);
                        }

                        else if(expression[i] == ')')
                        {
                                    while(!S.empty() && S.top() !=  '(') {
                                                postfix += S.top();
                                                S.pop();
                                    }
                                    S.pop();
                        }
            }

            while(!S.empty()) {
                        postfix += S.top();
                        S.pop();
            }

            return postfix;
}

bool IsOperand(char C)
{
            if(C >= '0' && C <= '9') return true;
            if(C >= 'a' && C <= 'z') return true;
            if(C >= 'A' && C <= 'Z') return true;
            return false;
}
bool IsOperator(char C)
{
            if(C == '+' || C == '-' || C == '*' || C == '/' || C== '$')
                        return true;

            return false;
}

int IsRightAssociative(char op)
{
            if(op == '$') return true;
            return false;
}

int GetOperatorWeight(char op)
{
            int weight = -1;
            switch(op)
            {
            case '+':
            case '-':
                        weight = 1;
            case '*':
            case '/':
                        weight = 2;
            case '$':
                        weight = 3;
            }
            return weight;
}

int HasHigherPrecedence(char op1, char op2)
{
            int op1Weight = GetOperatorWeight(op1);
            int op2Weight = GetOperatorWeight(op2);

           
            if(op1Weight == op2Weight)
            {
                        if(IsRightAssociative(op1)) return false;
                        else return true;
            }
            return op1Weight > op2Weight ?  true: false;

}

OUTPUT