0% found this document useful (0 votes)
28 views8 pages

Sea130 DS Exp 2

The document describes an algorithm to convert infix notation expressions to postfix notation. It details the different notation types and precedence rules. The algorithm uses a stack to process the infix expression from left to right, pushing operators and popping to output the postfix form.

Uploaded by

Ayush
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
28 views8 pages

Sea130 DS Exp 2

The document describes an algorithm to convert infix notation expressions to postfix notation. It details the different notation types and precedence rules. The algorithm uses a stack to process the infix expression from left to right, pushing operators and popping to output the postfix form.

Uploaded by

Ayush
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 8

Experiment No: 2

Aim:
To convert Infix expression to Postfix form

Name and roll no of Division Date of Date of

student performance submission

Name: 21/09/21
Tiwari
NAIDU Ayush Manoj
ANURADHA 21/09/21
SHRIKANT A
SEA130
Roll no: SEA 124
TITLE:
Write a program in C to convert Infix expression to Postfix form.

THEORY:

There are three different but equivalent notations of writing


algebraic expressions: infix, postfix and prefix. Postfix notation
was developed by Jan Lukasiewicz who was a Polish logician,
mathematician, and philosopher. His aim was to develop a
parenthesis-free prefix notation (also known as Polish
notation) and a postfix notation, which is better known as
Reverse Polish Notation or RPN. Although it is easy for us to
write expressions using infix notation, computers find it
difficult to parse as the computer needs a lot of information to
evaluate the expression. Information is needed about operator
precedence and associativity rules, and brackets which override
these rules. So, computers work more efficiently with
expressions written using prefix and postfix notations.

Infix expression:
In infix notation the operator is placed in between the
operands.
Syntax:
<operand1> <operator> <operand2>
Example:
a+b

Postfix notation (or Reverse polish notation)


In postfix notation the operator is placed after the operands.
Syntax:
<operand1> <operand2> <operator>
Example:
ab+
Prefix notation (or Polish notation)
In a prefix notation, the operator is placed before the operands.
Syntax:
<operator> <operand1> <operand2>
Example:
+ab

Algorithm:

Program:

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
#define SIZE 100
char stack[SIZE];
int top = -1;
void push(char item)
{
if(top >= SIZE-1)
{
printf("\nStack Overflow.");
}
else
{
top = top+1;
//top=-1 top=-1+1=0
stack[top] = item;
//stack[0]='('
}
}

char pop()
{
char item ;

if(top <0)
{
printf("stack under flow: invalid infix expression");
getchar();
/* underflow may occur for invalid expression */
/* where ( and ) are not matched */
exit(1);
}
else
{
item = stack[top];
top = top-1;
return(item);
}
}
/* define function that is used to determine whether any symbol is
operator or not
(that is symbol is operand)
* this fucntion returns 1 if symbol is opreator else return 0 */

int is_operator(char symbol)


{
if(symbol == '^' || symbol == '*' || symbol == '/' || symbol ==
'+' || symbol =='-')
{
return 1;
}
else
{
return 0;
}
}

/* define fucntion that is used to assign precendence to operator.


* Here ^ denotes exponent operator.
* In this fucntion we assume that higher integer value
* means higher precendence */

int precedence(char symbol)


{
if(symbol == '^')/* exponent operator, highest precedence*/
{
return(3);
}
else if(symbol == '*' || symbol == '/')
{
return(2);
}
else if(symbol == '+' || symbol == '-') /* lowest
precedence */
{
return(1);
}
else
{
return(0);
}
}

void InfixToPostfix(char infix_exp[], char postfix_exp[])


{
int i, j;
char item;
char x;

push('('); /* push '(' onto stack


*/
strcat(infix_exp,")"); /* add ')' to infix
expression */ //A+B*C)

i=0;
j=0;
item=infix_exp[i]; /* initialize before loop*/
//item=+

while(item != '\0') /* run loop till end of infix


expression */
{
if(item == '(')
{
push(item);
}
else if( isdigit(item) || isalpha(item))
{
postfix_exp[j] = item; /* add operand symbol
to postfix expr */
j++;
//postfix_exp[0]=A
}
else if(is_operator(item) == 1) /* means symbol is
operator */
{
x=pop();
while(is_operator(x) == 1 && precedence(x)>=
precedence(item))
{
postfix_exp[j] = x; /* so pop all
higher precendence operator and */
j++;
x = pop(); /* add them to
postfix expresion */
}
push(x);
/* because just above while loop will terminate we have
oppped one extra item
for which condition fails and loop terminates, so that
one*/

push(item); /* push current oprerator


symbol onto stack */
}
else if(item == ')') /* if current symbol is ')' then
*/
{
x = pop(); /* pop and keep popping
until */
while(x != '(') /* '(' encounterd */
{
postfix_exp[j] = x;
j++;
x = pop();
}
}
else
{ /* if current symbol is neither operand not '(' nor ')' and
nor
operator */
printf("\nInvalid infix Expression.\n"); /* the it
is illegeal symbol */
getchar();
exit(1);
}
i++;

item = infix_exp[i]; /* go to next symbol of infix expression


*/
} /* while loop ends here */
if(top>0)
{
printf("\nInvalid infix Expression.\n"); /* the it is
illegeal symbol */
getchar();
exit(1);
}
if(top>0)
{
printf("\nInvalid infix Expression.\n"); /* the it is
illegeal symbol */
getchar();
exit(1);
}

postfix_exp[j] = '\0'; /* add sentinel else puts() fucntion */


/* will print entire postfix[] array upto SIZE */

int main()
{
char infix[SIZE], postfix[SIZE];
printf("\nEnter Infix expression : ");
gets(infix);
InfixToPostfix(infix,postfix);
printf("Postfix Expression: ");
puts(postfix);
return 0;
}
OUTPUT :

You might also like