Sunday, 9 March 2014

Program to convert an Infix form to Postfix form.

Program to convert an Infix form to Postfix form.

Code for Program to convert an Infix form to Postfix form in C Programming

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>

#define MAX 50

struct infix
{
    char target[MAX] ;
    char stack[MAX] ;
    char *s, *t ;
    int top ;
} ;

void initinfix ( struct infix * ) ;
void setexpr ( struct infix *, char * ) ;
void push ( struct infix *, char ) ;
char pop ( struct infix * ) ;
void convert ( struct infix * ) ;
int priority ( char ) ;
void show ( struct infix ) ;

void main( )
{
    struct infix p ;
    char expr[MAX] ;

    initinfix ( &p ) ;

    clrscr( ) ;

    printf ( "\nEnter an expression in infix form: " ) ;
    gets ( expr ) ;

    setexpr ( &p, expr ) ;
    convert ( &p ) ;

    printf ( "\nThe postfix expression is: " ) ;
    show ( p ) ;

    getch( ) ;
}

/* initializes structure elements */
void initinfix ( struct infix *p )
{
    p -> top = -1 ;
    strcpy ( p -> target, "" ) ;
    strcpy ( p -> stack, "" ) ;
    p -> t = p -> target ;
    p -> s = ""  ;
}

/* sets s to point to given expr. */
void setexpr ( struct infix *p, char *str )
{
    p -> s = str ;
}

/* adds an operator to the stack */
void push ( struct infix *p, char c )
{
    if ( p -> top == MAX )
        printf ( "\nStack is full.\n" ) ;
    else
    {
        p -> top++ ;
        p -> stack[p -> top] = c ;
    }
}

/* pops an operator from the stack */
char pop ( struct infix *p )
{
    if ( p -> top == -1 )
    {
        printf ( "\nStack is empty.\n" ) ;
        return -1 ;
    }
    else
    {
        char item = p -> stack[p -> top] ;
        p -> top-- ;
        return item ;
    }
}

/* converts the given expr. from infix to postfix form */
void convert ( struct infix *p )
{
    char opr ;

    while ( *( p -> s ) )
    {
        if ( *( p -> s ) == ' ' || *( p -> s ) == '\t' )
        {
            p -> s++ ;
            continue ;
        }
        if ( isdigit ( *( p -> s ) ) || isalpha ( *( p -> s ) ) )
        {
            while ( isdigit ( *( p -> s ) ) || isalpha ( *( p -> s ) ) )
            {
                *( p -> t ) = *( p -> s ) ;
                p -> s++ ;
                p -> t++ ;
            }
        }
        if ( *( p -> s ) == '(' )
        {
            push ( p, *( p -> s ) ) ;
            p -> s++ ;
        }

        if ( *( p -> s ) == '*' || *( p -> s ) == '+' || *( p -> s ) == '/' || *( p -> s ) == '%' || *( p -> s ) == '-' || *( p -> s ) == '$' )
        {
            if ( p -> top != -1 )
            {
                opr = pop ( p ) ;
                while ( priority ( opr ) >= priority ( *( p -> s ) ) )
                {
                    *( p -> t ) = opr ;
                    p -> t++ ;
                    opr = pop ( p ) ;
                }
                push ( p, opr ) ;
                push ( p, *( p -> s ) ) ;
            }
            else
                push ( p, *( p -> s ) ) ;
            p -> s++ ;
        }

        if ( *( p -> s ) == ')' )
        {
            opr = pop ( p ) ;
            while ( ( opr ) != '(' )
            {
                *( p -> t ) = opr ;
                p -> t++ ;
                opr =  pop ( p ) ;
            }
            p -> s++ ;
        }
    }

    while ( p -> top != -1 )
    {
        char opr = pop ( p ) ;
        *( p -> t ) = opr ;
        p -> t++ ;
    }

    *( p -> t ) = '\0' ;
}

/* returns the priority of an operator */
int priority ( char c )
{
    if ( c == '$' )
        return 3 ;
    if ( c == '*' || c == '/' || c == '%' )
        return 2 ;
    else
    {
        if ( c == '+' || c == '-' )
            return 1 ;
        elsereturn 0 ;
    }
}

/* displays the postfix form of given expr. */
void show ( struct infix p )
{
    printf ( " %s", p.target ) ;
}

No comments:

Post a Comment