#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

/*  Translation to postfix Polish notation */

struct stack {
  int sp;
  int sz;
  char *stack;
} stack = { .sp = -1, .sz = 0, .stack = NULL };

static void push (char c) {
  if (stack.sz == stack.sp + 1) {
    stack.sz = 2*stack.sz + 1;
    stack.stack = (char *) realloc (stack.stack, stack.sz*sizeof (char));
  }
  stack.stack[++stack.sp] = c;
}

static char pop (void) {
  if (stack.sp < 0) {
    fprintf (stderr, "Cannot pop from stack: stack is empty\n");
    return 0;
  }
  return stack.stack[stack.sp--];
}

static char peek (void) {
  if (stack.sp < 0) {
    fprintf (stderr, "Cannot pop from stack: stack is empty\n");
    return 0;
  }
  return stack.stack[stack.sp];
}

static int isempty (void) {
  return stack.sp == -1;
}

static char getop (void) {
  int c;

  while ((c = getchar ()) != EOF && isblank (c))
    ;
  return c == EOF || c == '\n' ? 0 : c;
}

static int isop (char c) {
  return (c == '+') || (c == '-') || (c == '*') || (c == '/');
}

static int prio (char c) {
  if (c == '(')
    return 0;
  if (c == '+' || c == '-')
    return 1;
  if (c == '*' || c == '/')
    return 2;
  return -1;
}

int main (void) {
  char c, op;

  while (c = getop ()) {
    if (isalpha (c))
      putchar (c);
    else if (c == '(')
      push (c);
    else if (isop (c)) {
      while (! isempty ()) {
        op = pop ();
	if (prio (c) > prio (op)) {
	  push (op);
	  break;
	} else
	  putchar (op);
      }
      push (c);
    } else if (c == ')')
      while ((op = pop ()) != '(')
	putchar (op);
  }
  while (! isempty ())
    putchar (pop ());
  putchar ('\n');
  return 0;
}
