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

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

int
pop(char *s, int *top)
{
    *top--;
    return s[*top];
}

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

    operator['('] = 0;
    operator['+'] = 1;
    operator['-'] = 1;
    operator['*'] = 2;
    operator['/'] = 2;
/* This program stop here */
    while (*in) {
        if (isdigit(*in)) {
            push(post, tp, *in);
        } else { /* Operator */
            while (1) {
                switch (*in) {
                    case '(':
                        push(stk, ts, *in);
                        break;
                    case ')':
                        while (stk[*ts - 1] != '(') {
                            push(post, tp, pop(stk, ts));
                        }
                        pop(stk, ts);
                        break;
                    default:
                        break;
                }
                if (*in == '(' && *in == ')') {
                    break;
                }
                if (!stk[*ts - 1]) {
                    while (operator[stk[*ts - 1]] >= operator[*in]) {
                        push(post, tp, pop(stk, ts));
                        if (stk[*ts - 1]) {
                            break;
                        }
                    }
                }
                break;
            }
            if (*in != '(' && *in != ')') {
                push(stk, ts, *in);
            }
        }
        in++;
    }
}

void
stack_empty(char *post, char *stk, int *ts)
{
    while (stk[*ts - 1]) {
        push(post, ts, pop(stk, ts));
    }
}

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

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