#include<iostream>
#include<string>
#include<stack>
using namespace std;
int main()
{
string str;
cin>>str;
stack<char> s;
for(int i=0;i<str.length();i++){
if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z')){ //直接输出操作数
cout<<str[i];
}else if(str[i]=='+'||str[i]=='-'){ //操作符入栈,但要确保栈顶元素的优先级低于他,乘除 大于 加减大 于 括号 ,否则先弹出后入栈
while(true){ //左括号直接入栈,遇到右括号,将上一个左括号前操作符全部出栈
if(s.empty()){
break;
}
if(s.top()=='*'||s.top()=='/'||s.top()=='+'||s.top()=='-'){
cout<<s.top();
s.pop();
}else{
break; //左括号只有遇到右括号才弹出
}
}
s.push(str[i]);
}else if(str[i]=='*'||str[i]=='/'){
while(true){
if(s.empty()){
break;
}
if(s.top()=='*'||s.top()=='/'){ //遇到更低才不继续弹出
cout<<s.top();
s.pop();
}else{
break;
}
}
s.push(str[i]);
}else if(str[i]=='('){
s.push(str[i]);
}else{
while(true){
if(s.empty()){
break;
}
if(s.top()=='('){
s.pop();
break;
}else{
cout<<s.top();
s.pop();
}
}
}
}
while(!s.empty()){
cout<<s.top();
s.pop();
}
return 0;
}