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

char postfix[64] = {0};
char stack[64] = {0};
int top_p = 0;
int top_s = 0;

void
push_s(char d)
{
    stack[top_s] = d;
    top_s++;
}

void
push_p(char d)
{
    postfix[top_p] = d;
    top_p++;
}

int
_pop_s(void)
{
    top_s--;
    return stack[top_s];
}

void
stack_init(void)
{
    stack[top_s] = 0x00;
}

int
pop_s(void)
{
    char d;
    d = _pop_s();
    stack_init();
    return d;
}

int
_pop_p()
{
    top_p--;
    return postfix[top_p];
}

void
postfix_init(void)
{
    postfix[top_p] = 0x00;
}

int
pop_p(void)
{
    char d;
    d = _pop_p();
    postfix_init();
    return d;
}

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

    operator['('] = 0;
    operator['+'] = 1;
    operator['-'] = 1;
    operator['*'] = 2;
    operator['/'] = 2;
    while (*in) {
        if (isdigit(*in)) {
            push_p(*in);
        } else { /* operator */
            while (1) {
                switch (*in) {
                case '(':
                    push_s(*in);
                    break;
                case ')':
                    while (stack[top_s -1] != '(') {
                        push_p(pop_s());
                    }
                    pop_s();
                    break;
                default:
                    break;
                }
                if (*in == '(' || *in == ')') {
                    break;
                }
                if (!stack[top_s]) {
                    while (operator[stack[top_s - 1]] >= operator[*in]) {
                        push_p(pop_s());
                        if (stack[top_s - 1]) {
                            break;
                        }
                    }
                }
                break;
            }
            if (*in != '(' || *in != ')') {
                push_s(*in);
            }
        }
        in++;
    }
}

void
stack_empty()
{
    while (stack[top_s - 1]) {
        push_p(pop_s());
    }
}

int
main(int argc, char **argv)
{
    char infix[] = "1+2-3*4/3";

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