#include <stdio.h>
#include <ctype.h>

int top_p = 0;
int top_s = 0;

void
push_p(char *s, int c)
{
    s[top_p] = c;
    top_p++;
}

void
push_s(char *s, int c)
{
    s[top_s] = c;
    top_s++;
}

int
pop_p(char *s)
{
    top_p--;
    return s[top_p];
}

int
pop_s(char *s)
{
    top_s--;
    return s[top_s];
}

void
infix_to_postfix(char *in, char *post, char *stk)
{
    char operator[256] = {0};

    operator['('] = 0;
    operator['+'] = 1;
    operator['-'] = 1;
    operator['*'] = 2;
    operator['/'] = 2;
    while (*in) {
        if (isdigit(*in)) {
            push_p(post, *in);
        } else { /* Operator */
            while (1) {
                switch (*in) {
                    case '(':
                        push_s(stk, *in);
                        break;
                    case ')':
                        while (stk[top_s - 1] != '(') {
                            push_p(post, pop_s(stk));
                        }
                        pop_s(stk);
                        break;
                    default:
                        break;
                }
                if (*in == '(' && *in == ')') {
                    break;
                }
/* go here */
                if (!stk[top_s - 1]) {
                    while (operator[stk[top_s - 1]] >= operator[*in]) {
                        push_p(post, pop_s(stk));
                        if (stk[top_s - 1]) {
                            break;
                        }
                    }
                }
                break;
            }
            if (*in != '(' && *in != ')') {
                push_s(stk, *in);
            }
        }
        in++;
    }
}

void
stack_empty(char *post, char *stk)
{
    while (stk[top_s - 1]) {
        push_p(post, pop_s(stk));
    }
}

int
main(int argc, char **argv)
{
    char infix[] = "2*((3-5)*2)";
    char postfix[256] = {0};
    char stack[256] = {0};

    infix_to_postfix(infix, postfix, stack);
    stack_empty(postfix, stack);
    printf("%s\n", postfix);
    return 0;
}