#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#define MAXSIZE 1000
typedef struct stack{
char c;
struct stack *next;
}Listack,*pListack;
pListack initStack()
{
pListack p = (pListack)malloc(sizeof(Listack));
if(!p) exit(-1);
p->next = NULL;
return p;
}
void push(pListack S,char t)
{
pListack p = (pListack)malloc(sizeof(Listack));
if(!p) exit(-1);
p->c = t ;
p->next = S->next;
S->next = p;
}
bool pop(pListack S)
{
pListack p = S->next ;
if(!p) return 0;
S->next = p->next;
free(p);
return 1;
}
bool isEmpty(pListack S)
{
if(!S->next) return 1;
else return 0;
}
char top(pListack S)
{
if(!S->next) exit(-1);
else
return S->next->c;
}
int main()
{
pListack S = initStack();
char s[MAXSIZE];
scanf("%s",s);
int len = strlen(s);
for(int i=0;i<len;i++)
{
char x = s[i];
switch(x)
{
case '(' :
push(S,x);
break;
case ')':
while(!isEmpty(S)&&top(S)!='(')
{
printf("%c",top(S));
pop(S);
}
pop(S);
break;
case '*':
while(!isEmpty(S) && top(S)!='(')
{
if(top(S)=='*'||top(S)=='/')
{
printf("%c",top(S));
pop(S);
}
else break;
}
push(S,x);
break;
case '/':
while(!isEmpty(S) && top(S)!='(')
{
if(top(S)=='*'||top(S)=='/')
{
printf("%c",top(S));
pop(S);
}
else break;
}
push(S,x);
break;
case '+':
while(!isEmpty(S)&&top(S)!='(')
{
if(!isEmpty(S))
{
printf("%c",top(S));
pop(S);
}
else break;
}
push(S,x);
break;
case '-':
while(!isEmpty(S)&&top(S)!='(')
{
if(!isEmpty(S))
{
printf("%c",top(S));
pop(S);
}
else break;
}
push(S,x);
break;
default:
printf("%c",x);
break;
}
}
while(!isEmpty(S))
{
printf("%c",top(S));
pop(S);
}
return 0;
}