feat: add infix_to_postfix.c

This commit is contained in:
Harsh Karande 2020-09-30 20:34:51 +05:30
parent 4cb3eeb1af
commit d7f0955930

View File

@ -0,0 +1,193 @@
/**
* Program documentation
* @name infix_to_postfix
* @brief Infix to Postfix Expression Conversion
* @details Convert Infixed expressions to Postfix expression.
* @author [Harsh Karande](https://github.com/harshcut)
*/
#include <conio.h>
#include <stdio.h>
// globally declared structure
struct Stack
{
char arr[10]; // static array of integers
int tos; // stores index on topmost element in stack
};
// function headers
void push(struct Stack *p, char ch); // pust element in stack
char pop(struct Stack *p); // pop topmost element from the stack
int isOprnd(char ch); // chack if element is operand or not
int isEmpty(struct Stack s); // check if stack is empty
int prcnd(char op1, char op2); // check operator precedence
void convert(char infix[],
char postfix[]); // convert infix to postfix expression
/**
* @brief Main function
* @returns 0 on exit
*/
int main()
{
char infix[20], postfix[20];
printf("Enter infix expression: ");
scanf("%s", infix);
convert(infix, postfix);
printf("Postfix expression is %s", postfix);
return 0;
}
/**
* @brief push function
* @returns void
*/
void push(struct Stack *p, char x)
{
if (p->tos == 9)
{
printf("Stack Overflow!");
return;
}
p->tos += 1;
p->arr[p->tos] = x;
}
/**
* @brief pop function
* @returns x or \0 on exit
*/
char pop(struct Stack *p)
{
char x;
if (p->tos == -1)
{
printf("Stack Underflow!");
return '\0';
}
x = p->arr[p->tos];
p->tos -= 1;
return x;
}
/**
* @brief isOprnd function
* @returns 1 or 0 on exit
*/
int isOprnd(char ch)
{
if ((ch >= 65 && ch <= 90) || (ch >= 97 && ch <= 122) ||
(ch >= 48 && ch <= 57))
{
return 1;
}
else
{
return 0;
}
}
/**
* @brief isEmpty function
* @returns 1 or 0 on exit
*/
int isEmpty(struct Stack s)
{
if (s.tos == -1)
{
return 1;
}
else
{
return 0;
}
}
/**
* @brief convert function
* @returns postfixed expresion or \0 on exit
*/
void convert(char infix[], char postfix[])
{
struct Stack s;
s.tos = -1;
int i, j = 0, pr;
char ch;
for (i = 0; infix[i] != '\0'; i++)
{
ch = infix[i];
if (isOprnd(ch) == 1)
{
postfix[j] = ch;
j++;
}
else
{
while (isEmpty(s) == 0)
{
pr = prcnd(ch, s.arr[s.tos]);
if (pr == 1)
{
break;
}
postfix[j] = pop(&s);
j++;
}
push(&s, ch);
}
}
while (isEmpty(s) == 0)
{
postfix[j] = pop(&s);
j++;
}
postfix[j] = '\0';
}
/**
* @brief prcnd function
* @returns 1 or 0 on exit
*/
int prcnd(char op1, char op2)
{
if (op2 == '$')
{
return 0;
}
else if (op1 == '$')
{
return 1;
}
else if (op2 == '*' || op2 == '/' || op2 == '%')
{
return 0;
}
else if (op1 == '*' || op1 == '/' || op1 == '%')
{
return 1;
}
else if (op2 == '+' || op2 == '-')
{
return 0;
}
else
{
return 1;
}
}