#include <iostream>
using namespace std;
const int otbl[7][7] =
{{-2, -2, 2, 2, 2, -1, 0},//i+
{-2, -2, 2, 2, 2, -1, 0}, //-
{-2, -2, -2, -2, 2, -1, 0}, //*
{-2, -2, -2, -2, 2, -1, 0}, ///
{ 2, 2, 2, 2, 2, -1, 0}, //(
{-1, -1, -1, -1, -1, -1, 0}, //)
{ 2, 2, 2, 2, 2, 2, -3}};//@
//o+ - * / ( ) @
struct stack
{
char n[1001];
int top;
stack()
{
memset(n, 0, sizeof n);
top = 0;
}
void push(char x)
{
n[++top] = x;
}
char pop()
{
if(top > 0)
return n[top--];
return '!';
}
bool empty()
{
if(top > 0)
return false;
return true;
}
}oprt;
bool isdigit(char x)
{
if(x != '@' && x != '+' && x != '-' && x != '*'
&&x != '/' && x != '(' && x != ')')
return true;
return false;
}
int ocmp(char opa, char opb)
{
int opax = 0;
switch(opa)
{
case '+': opax = 0; break;
case '-': opax = 1; break;
case '*': opax = 2; break;
case '/': opax = 3; break;
case '(': opax = 4; break;
case ')': opax = 5; break;
case '@': opax = 6; break;
}
int opbx = 0;
switch(opb)
{
case '+': opbx = 0; break;
case '-': opbx = 1; break;
case '*': opbx = 2; break;
case '/': opbx = 3; break;
case '(': opbx = 4; break;
case ')': opbx = 5; break;
case '@': opbx = 6; break;
}
return otbl[opbx][opax];
}
string tostring(int x)
{
string str = "";
int n[101], y = x;
memset(n, 0, sizeof n);
for(int i = 1; y > 0; y /= 10)
{
n[i++] = y % 10;
n[0]++;
}
for(int i = n[0]; i > 0; i--)
str += char(n[i] + '0');
return str;
}
int main()
{
string s, r = "";
cin >> s;
s += '@';
int lng = s.length();
oprt.push('@');
int x = 0;
for(int i = 0; i <= lng; i++)
{
if(isdigit(s[i]))
{
r += s[i];
continue;
}
else
{
int flg = ocmp(s[i], oprt.n[oprt.top]);
switch(flg)
{
case 2: oprt.push(s[i]);
break;
case -2: while(ocmp(s[i], oprt.n[oprt.top]) == -2)
r += oprt.pop();
oprt.push(s[i]);
break;
case -1: while(oprt.n[oprt.top] != '(')
r += oprt.pop();
oprt.pop();
break;
case 0: while(oprt.n[oprt.top] != '@')
r += oprt.pop();
break;
case -3: x = 99999; break;
}
if(x == 99999)
break;
}
}
cout << r << endl;
return 0;
}