With a given Infix Expression, we will see how to convert Infix Expression into Postfix Expression using stack.
Algorithm to convert Infix expression to Postfix expression:
In this algorithm, we will use operatorStack to store operators during the conversion. The step are as follows:- Initialize empty operatorStack
- While the end of input infix string
- symbol = next input character
- If symbol is an operand
- add symbol to the postfix string
- Else
- While( operatorStack is not empty && precedence of top character of operatorStack is higher than symbol)
- topsymbol = pop the operatorStack
- add topsymbol to the postfix string
- End While
- If (operatorStack is empty || symbol is not equal to '(' )
- push symbol into operatorStack
- Else
- pop the operatorStack
- End If
- While( operatorStack is not empty && precedence of top character of operatorStack is higher than symbol)
- End If
- While the operatorStack is not empty
- topsymbol = pop the operatorStack
- add topsymbol to the postfix string
- End While
Function to convert Infix expression to Postfix expression:
void infix_to_postfix(char *infix_str, char *postfix_str){
int i = -1, j = -1;
STACK stk;
stk.top = -1;
while(infix_str[++i]){
if(infix_str[i] == ' '){
continue;
}
if( ischar(infix_str[i]) ){
postfix_str[++j] = infix_str[i];
}
else{
while( !empty_stack(&stk) && precedence( top_of_stack(&stk), infix_str[i]) ){
postfix_str[++j] = pop(&stk);
}
if(empty_stack(&stk) || infix_str[i] != ')'){
push(&stk,infix_str[i]);
}
else{
pop(&stk);
}
}
}
while(!empty_stack(&stk)){
postfix_str[++j] = pop(&stk);
}
postfix_str[++j] = '\0';
}
Program to convert Infix expression to Postfix expression:
#include <stdio.h>
#include <stdlib.h>
#define STACK_SIZE 50
typedef struct{
int top;
char stack[STACK_SIZE];
} STACK;
void push(STACK *, char );
char pop(STACK *);
void infix_to_postfix(char *, char*);
char top_of_stack(STACK *);
int ischar(char );
int empty_stack(STACK*);
int precedence(char,char);
int main(){
char *infix_str = "A+(B*C)/D";
char postfix_str[100];
infix_to_postfix(infix_str, postfix_str);
printf("Infix Expression : %s\n", infix_str);
printf("Postfix Expression : %s\n", postfix_str);
return 0;
}
// return true when op1 has higher precedence over op2
int precedence(char op1, char op2){
char *sym = "/*+-";
int i1 = -1, i2 = -1,i = -1;
if(op1 == '(')
return 0;
if(op2 == '('){
if(op1 != ')')
return 0;
return 1;
}
if(op2 == ')'){
if(op1 != '(')
return 1;
return 0;
}
if(op1 == ')')
exit(1);
while(sym[++i]){
if(op1 == sym[i])
i1 = i;
if(op2 == sym[i])
i2 = i;
}
return i1 < i2;
}
void infix_to_postfix(char *infix_str, char *postfix_str){
int i = -1, j = -1;
STACK stk;
stk.top = -1;
while(infix_str[++i]){
if(infix_str[i] == ' '){
continue;
}
if( ischar(infix_str[i]) ){
postfix_str[++j] = infix_str[i];
}
else{
while( !empty_stack(&stk) && precedence( top_of_stack(&stk), infix_str[i]) ){
postfix_str[++j] = pop(&stk);
}
if(empty_stack(&stk) || infix_str[i] != ')'){
push(&stk,infix_str[i]);
}
else{
pop(&stk);
}
}
}
while(!empty_stack(&stk)){
postfix_str[++j] = pop(&stk);
}
postfix_str[++j] = '\0';
}
char top_of_stack(STACK *s){
return s->stack[s->top];
}
int empty_stack(STACK *stk){
return stk->top == -1;
}
int ischar(char c){
return ( (c >= 'a') && (c <= 'z') ) ||
( (c >= 'A') && (c <= 'Z') ) ||
( (c >= '0') && (c <= '9') );
}
void push(STACK *s, char c){
if(s->top == STACK_SIZE-1){
printf("Stack Overflow\n");
exit(1);
}
else{
s->stack[++s->top] = c;
}
}
char pop(STACK *s){
if(s->top == -1){
printf("Stack Underflow\n");
exit(1);
}
else{
return s->stack[s->top--];
}
}
Infix Expression : A+(B*C)/D Postfix Expression : ABC*D/+
Comments
Post a Comment