#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct stack
{
int size;
int top;
char *arr;
};
int isEmpty(struct stack *ptr)
{
if (ptr->top == -1)
{
return 1;
}
else
{
return 0;
}
}
int isFull(struct stack *ptr)
{
if (ptr->top == ptr->size - 1)
{
return 1;
}
else
{
return 0;
}
}
char stackTop(struct stack *sp)
{
return sp->arr[sp->top];
}
void push(struct stack *ptr, char val)
{
if (isFull(ptr))
{
printf("Stack Overflow! Cannot push %d to the stack\n", val);
}
else
{
ptr->top++;
ptr->arr[ptr->top] = val;
}
}
char pop(struct stack *ptr)
{
if (isEmpty(ptr))
{
printf("Stack Underflow! Cannot pop from the stack\n");
return -1;
}
else
{
char val = ptr->arr[ptr->top];
ptr->top--;
return val;
}
}
int precedence(char ch)
{
if (ch == '^')
return 3;
else if (ch == '*' || ch == '/')
return 2;
else if (ch == '+' || ch == '-')
return 1;
else
return 0;
}
int isOperator(char ch)
{
if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '^')
return 1;
else
return 0;
}
char *infixToPostfix(char *infix)
{
struct stack *sp = (struct stack *)malloc(sizeof(struct stack));
sp->size = 10;
sp->top = -1;
sp->arr = (char *)malloc(sp->size * sizeof(char));
char *postfix = (char *)malloc((strlen(infix) + 1) * sizeof(char));
int i = 0;
int j = 0;
while (infix[i] != '\0')
{
if (!isOperator(infix[i]))
{
postfix[j] = infix[i];
j++;
i++;
}
else
{
if (precedence(infix[i]) > precedence(stackTop(sp)))
{
push(sp, infix[i]);
i++;
}
else
{
postfix[j] = pop(sp);
j++;
}
}
}
while (!isEmpty(sp))
{
postfix[j] = pop(sp);
j++;
}
postfix[j] = '\0';
return postfix;
}
char *infixToPrefix(char *infix)
{
int l = strlen(infix);
// Reverse infix
strrev(infix);
for (int i = 0; i < l; i++)
{
if (infix[i] == '(')
{
infix[i] = ')';
i++;
}
else if (infix[i] == ')')
{
infix[i] = '(';
i++;
}
}
char *prefix = (char *)malloc((strlen(infix) + 1) * sizeof(char));
prefix = infixToPostfix(infix);
// Reverse postfix
strrev(prefix);
return prefix;
}
int main()
{
char s[50];
printf("enter the expression : ");
gets(s);
printf("%s", infixToPostfix(s));
printf("\n");
printf("%s", infixToPrefix(s));
return 0;
}