/* solution of convertion of infix to postfix */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct StackRecord
{
char Operator[32];
int TopIndex;
int Capacity;
};
typedef struct StackRecord * Stack;
Stack CreateStack()
{
Stack S = malloc(sizeof(struct StackRecord));
S->TopIndex = -1;
S->Capacity = 32;
}
inline int IsEmpty(Stack S){return S->TopIndex == -1;}
inline int IsFull(Stack S){return S->TopIndex == 31;}
void Push(Stack S,char Operator)
{
// assuming S is not NULL, hha
S->Operator[++S->TopIndex] = Operator;
}
char Pop(Stack S)
{
if(IsEmpty(S)) return 0;
return S->Operator[S->TopIndex--];
}
char Top(Stack S)
{
if(IsEmpty(S)) return 0;
return S->Operator[S->TopIndex];
}
int GetOperatorClass(char Operator)
{
switch(Operator)
{
case '+': case '-':
return 0;
case '*': case '/':
return 1;
case '^':
return 2;
case '(':
return 10;
default:
return -1;
}
}
int IsOperator(char c)
{
switch(c)
{
case '+':case '-':case '*':case '/':case '(':case ')':case '^':
return 1;
default:
return 0;
}
}
void PrintStack(Stack S)
{
int i = 0;
printf("Current Stack: ");
for(; i <= S->TopIndex; ++i)
printf("%c ", S->Operator[i]);
printf("\n");
}
int main()
{
char *infix = "a+b*c^h^i+(d*e+f)*g";
char postfix[128] = "\0";
int len = strlen(infix);
int i = 0;
Stack S = CreateStack();
char top;
int j = 0;
char curr;
for(;i < len; ++i)
{
postfix[j] = '\0';
printf("Current Output: %s\n",postfix);
curr = infix[i];
if(IsOperator(curr))
{
PrintStack(S);
if (curr == ')')
{
while('(' != (top = Pop(S)))
postfix[j++] = top;
}else if(curr == '^')
{
top = Top(S);
while(top != '^' &&
(GetOperatorClass(curr) <= GetOperatorClass(top)) &&
top != '(')
{
postfix[j++] = top; Pop(S);
top = Top(S);
}
Push(S,curr);
}
else
{
{
top = Top(S);
while((GetOperatorClass(curr) <= GetOperatorClass(top)) && top != '(')
{
postfix[j++] = top; Pop(S);
top = Top(S);
}
}
Push(S,curr);
}
}
else
postfix[j++] = curr;
}
while((top = Pop(S)) != 0)
postfix[j++] = top;
postfix[j++] = '\0';
printf("%s",postfix);
return 0;
}