Dor de cabeça com notação polonesa reversa

Já vi muita gente apaiando com esse problema, se tiver alguém que resolva agradeço muito meu codigo não executa corretamente.

package notacaopolonesa;


class pilha{
    int max = 10, topo = 0;
       
    String[] elem = new String[max];
    
    boolean cheia(){
        if( topo == max )return true;
        else return false;
    }
    
    boolean vazia(){
        if( topo == 0 )return true;
        else return false;
    }
    
    //empilha um valor como uma string
    void empilha(String x){
        elem[topo] = x;
        topo = topo + 1;
        
    }
    
    //desempilha a quantidade de elementos solicitados
    String desempilha(int x){
        String retorno = elem[topo];
        topo = topo - x;
        return retorno;
        
    }
    
    void mostrapilha(){
      if(this.vazia()==true) System.out.println("Pilha vazia..");
      else{
        for(int i = topo-1; i >= 0; i--){
            System.out.print(elem[i]);
        }
      }
    }
}
/**
 *
 * @author jubei
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        
        pilha NovaPilha = new pilha();
        String expressao = new String();
        String resultado = new String();
        expressao = "(2+2)/2";
        
         
       NovaPilha.mostrapilha();
       
      for(int i = 0;i<expressao.length();i++){
          switch(expressao.charAt(i)){
              case ')':{
                  NovaPilha.desempilha(1);
                  break;
              }
              case '+':{
                  NovaPilha.empilha(String.valueOf(expressao.charAt(i)));
                  break;
              }
              case '-':{
                  NovaPilha.empilha(String.valueOf(expressao.charAt(i)));
                  break;
              }
              case '*':{
                  NovaPilha.empilha(String.valueOf(expressao.charAt(i)));
                  break;
              }
              case '/':{
                  NovaPilha.empilha(String.valueOf(expressao.charAt(i)));
                  break;
              }
              default: {
                  if (expressao.charAt(i)!='('){
                    resultado = resultado + expressao.charAt(i);
                    break;
                  }
              }
          }
      }  
       
      while(!NovaPilha.vazia()){
          resultado = resultado + NovaPilha.desempilha(1);
      }
      
        
      
       NovaPilha.mostrapilha();
       System.out.println(resultado); 
       
    }

}

Vc poderia usar a classe Stack ?

java.sun.com/j2se/1.4.2/docs/api/java/util/Stack.html

desculpe, mas sou ainda não conheço esta classe, em que ela poderia me ajudar.

Se for um trabalho pra matéria de estrutura de dados ou alguma coisa, não use a Stack.
Agora, se for para outra coisa, use-a. A classe Stack tem (praticamente) todas as operações que se pode fazer em uma pilha já implementadas. Dessa forma, você não “perde tempo” implementado seus push, pop e topos :slight_smile: (ou seja, a parte legal, você não precisa fazer :D)

Realmente é um trabalho para faculdade, não posso usar facilidades, então preciso fazer na marra. Meu código empilha, desempilha mas não coloca a expressão correta.

Então, seu algoritmo de pilha, apesar de simples, está correto. Eu havia trocado a implementação sua de pilha para o Stack da biblioteca padrão e o mesma saída apareceu.

O problema é seu algoritmo mesmo. A impressão que dá é que você quer converter uma expressão infix para prefix, correto? Na época em que fiz isso, eu desenhava no papel todos os possíveis passos da execução e, à medida em que eu fazia as descobertas, fazia o código.

Não vou dizer a solução, até porque não lembro mais, mas te dou umas dicas:
:arrow: Não é só uma linha para cada tipo de caracter, lembro disso muito bem.
:arrow: No fecha-parêntese, você desempilha e não pega a variável, indo pro limbo. Toma cuidado com bobeirinhas.
:arrow: Use um debugger.
:arrow: Não tente fazer com parêntese logo de cara, é o mais difícil. Faça primeiro um código só pra aceitar + e -. Quando funcionar, acrescente * e /. E por último, acrescente parênteses.

Obrigado, vou tentar assim.

.

Infelizmente ainda não consegui, este trabalho é para amanhã, não sei mais para onde correr.