import java.io.*;


/* Esta classe transforma uma expressão aritmética da notação infixa
   para a notação pósfixa. Supõe que a expressão está escrita corretamente */ 

public class Posfixa
{
  public static int Prioridade (char op)   // devolve a prioridade do operador
  {
    int p = 0;
    
    switch(op){
    case '(' : p = 1; break;
      
    case '+' : 
    case '-' : p = 2; break;
      
    case '*' : 
    case '/' : p = 3;
    }
    
    return (p);
  }

  public static  boolean EOperador (char op)  // verifica se o caractere é operador
  {
    return( op == '(' || op == ')' || op == '+' || 
            op == '-' || op == '*' || op == '/' );
  }
  
  public static void main (String [] entrada) 
     throws IOException, PilhaOverflow, PilhaUnderflow 
  {
    char caracterelido, eltopo;
    Pilha P;
    
    P = new Pilha();
    System.out.println("Digite a expressão infixa terminada por '.'");
    
    caracterelido = Leitura.leChar();
    
    while (caracterelido != '.'){

      if (!EOperador(caracterelido)) // operandos são impressos diretamente
        System.out.print(caracterelido);
      
      else         // é um operador
        if (P.PilhaVazia() || caracterelido == '(') // operador deve ser empilhado
	  P.Empilha(caracterelido);
        else 
	  if (caracterelido == ')'){  // deve desempilhar e imprimir até achar '('
	    eltopo = P.TopoPilha();
	    while( eltopo != '('){
	      System.out.print(eltopo);
	      P.Desempilha();
	      eltopo = P.TopoPilha();
	      
	    }
	    P.Desempilha(); // desempilha o '('
	  }
          else{
	    eltopo = P.TopoPilha();
	    while( !P.PilhaVazia() && 
                    Prioridade(eltopo) >= Prioridade(caracterelido)){
	      System.out.print(eltopo);
	      P.Desempilha();            // enquanto o topo da pilha tem prioridade
	                                 // maior, desempilha e imprime
	      if (!P.PilhaVazia())
		eltopo = P.TopoPilha();
	    }
	    P.Empilha(caracterelido);
	  }
      caracterelido = Leitura.leChar();      
    }

    while (! P.PilhaVazia()){            // últimos operadores que sobraram
      System.out.print(P.TopoPilha());
      P.Desempilha();
    }
    
    System.out.println(".");
  }
}
