import java.util.Scanner;
import java.util.Stack;
//中缀转换为后缀,利用Stack
public class Practise {
static Stack<Character> stack = new Stack<Character>();
//判断新读取的符号,是否优先级高于栈顶。
//情况1:栈顶为'+','-'而输入为'+''-',视为优先。
//情况2:栈定为'(',视为优先。
public static boolean isPrior(char c, char top) {
boolean b = false;
if ((top == '+' || top == '-' )&& (c == '*' || c == '/')//优先级高于
||top =='(')
{
b = true;
}
return b;
}
//返回true.当新读取的符号优先级高于栈顶,则直接将新读取的符号压栈。
//返回false,不优先于,则循环Pop直到第一次遇到'('或者stack被清空,然后将新读取的符号压栈。
public static void main(String[] arg) {
Scanner sc = new Scanner(System.in);
char[] arr = sc.nextLine().trim().toCharArray();
for(int i=0;i<arr.length;i++){
if (arr[i] == '+' || arr[i] == '-' || arr[i] == '*'|| arr[i] == '/' || arr[i] == '(' || arr[i] == ')') {
if (stack.isEmpty()) {//栈为空
stack.push(arr[i]);
}
else{//栈非空
// 为'(' 或 ')'
if(arr[i]=='('||arr[i]==')'){
// 为'(',直接压入栈中
if(arr[i]=='(')
{
stack.push(arr[i]);
}
// 为')',循环输出直至第一次遇到栈顶为'('时,break
else{
while(stack.peek()!='('){
System.out.print(stack.pop());
}
stack.pop();
}
}
//为'+','-','*','/'
else{
boolean isPrior = isPrior(arr[i], stack.peek());
//当新读取的符号优先级高于栈顶,则直接将新读取的符号压栈。
if(isPrior){
stack.push(arr[i]);
}
//当新读取的符号不优先于栈顶,则循环Pop直到第一次遇到'('或者stack被清空,
//然后将新读取的符号压栈。
else{
while(!stack.isEmpty()){
if(stack.peek()=='('){
break;
}
else{
System.out.print(stack.pop());
}
}
stack.push(arr[i]);
}
}
}
}
else {
System.out.print(arr[i]);
}
}
//将栈中剩余的符号 循环Pop出
while(!stack.isEmpty()){
System.out.print(stack.pop());
}
}
}
//Input 1: a+b*c+(d*e+f)*g
//Output1: abc*+de*f+g*+
//Input 2: a+b*((c+d)*(e+f)+g)+h+i*j
//Output2: abcd+ef+*g+*+h+ij*+