Sunday, 11 November 2018

conversion of infix notation to postfix notation.in c++


Q: Write a program to demonstrate the use of stack in converting arithmetic
expression from infix notation to postfix notation.



PROGRAM: -


#include<iostream>
#include <string.h>
#include <stdlib.h>using namespace std;struct Stack
{
                        int top;
                        unsigned capacity;
                        int* array;
};


struct Stack* createStack( unsigned capacity )
{
                        struct Stack* stack = (struct Stack*) malloc(sizeof(struct Stack));
                        if (!stack)
                                    return NULL;
                        stack->top = -1;
                        stack->capacity = capacity;
                        stack->array = (int*) malloc(stack->capacity * sizeof(int));
                        if (!stack->array)
                                    return NULL;
                        return stack;
}


int isEmpty(struct Stack* stack)
{
                        return stack->top == -1 ;
}


char peek(struct Stack* stack)
{
                        return stack->array[stack->top];
}


char pop(struct Stack* stack)
{
                        if (!isEmpty(stack))
                                    return stack->array[stack->top--] ;
                        return '$';
}


void push(struct Stack* stack, char op)
{
                        stack->array[++stack->top] = op;
}


int isOperand(char ch)
{
                        return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z');
}


int Prec(char ch)
{
                        switch (ch)
                        {
                        case '+':
                        case '-':
                                    return 1;
                        case '*':
                        case '/':
                                    return 2;
                        case '^':
                                    return 3;
                        }
                        return -1;
}


int infixToPostfix(char* exp)
{
                        int i, k;
                        struct Stack* stack = createStack(strlen(exp));
                        if(!stack)                                    return -1 ;
                        for (i = 0, k = -1; exp[i]; ++i)
                        {
                                    if (isOperand(exp[i]))
                                                exp[++k] = exp[i];
                                    else if (exp[i] == '(')
                                                push(stack, exp[i]);
                                    else if (exp[i] == ')')
                                    {
                                                while (!isEmpty(stack) && peek(stack) != '(')
                                                            exp[++k] = pop(stack);
                                                if (!isEmpty(stack) && peek(stack) != '(')
                                                            return -1;                              
                                                else                                                            pop(stack);
                                    }
                                    else                                    {
                                                while (!isEmpty(stack) && Prec(exp[i]) <= Prec(peek(stack)))
                                                            exp[++k] = pop(stack);
                                                push(stack, exp[i]);
                                    }
                        }
                        while (!isEmpty(stack))
                                    exp[++k] = pop(stack );
                        exp[++k] = '\0';
                        cout<<"\npostfix is :-\n"<<exp;
}


int main()
{                        cout<<"Infix is :- \na+b*(c^d-e)^(f+g*h)-i\n";                        char exp[] = "a+b*(c^d-e)^(f+g*h)-i";                        infixToPostfix(exp);
                        return 0;
}



OUTPUT:

Infix is :-


a+b*(c^d-e)^(f+g*h)-i


postfix is :- 

abcd^e-fgh*+^*+i-          

No comments:

Post a Comment