Aplicar algorítmo em Java

Boa tarde. Preciso passar o algorítmo a seguir para a linguagem Java. Na verdade seria qualquer linguagem, mas estou aprendendo Java, então achei que conseguiria, e depois de passar o carnaval inteiro tentando, não deu.
Se alguém puder me ajudar com o código, agradeço.
Ele analiza uma expressão matemática to tipo “{[()]}”, por exemplo, {3+5*[12/4]+27-(9-3)}, e ao final emite uma mensagem dizendo se é uma expressão válida ou não. O exercício não especifica se é ou não pra receber a expressão via teclado.

[code]algoritmo analizaExpressao;
var Expressao:string;
i:inteiro;
Simbolo:char;
Valido:boolean;
Inicio
Obter(Expressao);
i := 1;
valido := true;
Enquanto i < Tamnaho(Exp)+1 faca
Inicio
Simbolo := Expressao[i];
se simbolo pertence a { ‘{’,’[’,’(’ } entao
Empilha(MinhaPilha,simbolo);

     senao
        Inicio
          Se Simbolo pertence a { '}',']',')' } entao
             se PilhaVazia(MinhaPilha) entao
                valido:=false
             senao
                se (Simbolo = '}') e (ElementoDoTopo(MinhaPilha) = '{' ) entao
                 Desempilha(MinhaPilha)
             senao
                 se (Simbolo = ']') e (ElementoDoTopo(MinhaPilha) ='[' ) then
                    Desempilha(MinhaPilha)
                 senao
                    se (Simbolo = ')') e (ElementoDoTopo(MinhaPilha) = '(' ) entao
                          Desempilha(MinhaPilha);
         end;
     i := i + 1;
fim enquanto;

Se PilhaVazia(MinhaPilha) e valido entao
     Escrevere('Expressão Correta')
senao
     Escrever('Expressão Incorreta');

fim algoritimo.[/code]

Posta o código que ta dando erro pq daí fica mais fácil…

Cheguei nesse ponto e parei…Nem eu vejo sentido no que digitei.

[code]import javax.swing.JOptionPane;

public class Play {

public static void main(String[] args) {
	
	Expressao pilha = new Expressao(30);
				
		String expr = JOptionPane.showInputDialog("Digite uma expressao algébrica no formato {[()]}");
		for(int i=0;i<expr.length();i++)
			pilha.empilha(expr.charAt(i));[/code]

[code]public class Expressao {
private Object elementos[];
private int topo;
private boolean valido = true;

public Expressao(int tamanho){
	topo = -1;
	elementos = new Object[tamanho];
}

public void empilha(Object x){
	topo++;
	elementos[topo] = x;
}

public void desempilha(){
	topo--;
}

public Object elementoTopo(){
	return elementos[topo];
}

public boolean pilhaCheia(){
	return(topo == elementos.length - 1);
}

public int getTamanho(){
	return elementos.length;
}

public boolean listaVazia(){
	return(topo == -1);
}

public int getTopo(){
	return topo;
}

public Object getValor(int pos){
	return elementos[pos];
}

}[/code]

Pelo q vc postou , coloco a minha resposta encontrada.

[code] import javax.swing.*;

public class teste {

public static void main(String[] args) {

    Expressao pilha = new Expressao(6);

    String expr = JOptionPane.showInputDialog("Digite uma expressão algébrica no formato {[()]}");

    for (int i = 0; i <= expr.length() - 1; i++) {

        if (pilha.getDelimitador(expr.charAt(i))) {
            pilha.empilha(expr.charAt(i));
        }
    }

    String aux = pilha.retornaFormato();

    if (aux.equals("{[()]}")) {
        System.out.println("Expressão Correta");
    } else {
        System.out.println("Expressão Incorreta");
    }

}

}

class Expressao {

protected String elementos[];
private int topo;
protected char[] delimitadores = {'{', '[', '(', ')', ']', '}'};

public Expressao(int tamanho) {
    topo = -1;
    elementos = new String[tamanho];
}

public void empilha(char x) {
    topo++;
    elementos[topo] = String.valueOf(x);
}

public void desempilha() {
    topo--;
}

public String elementoTopo() {
    return elementos[topo].toString();
}

public boolean pilhaCheia() {
    return (topo == elementos.length - 1);
}

public boolean listaVazia() {
    return (topo == -1);
}

public boolean getDelimitador(char valor) {
    boolean ok = false;

    for (int i = 0; i <= delimitadores.length - 1; i++) {
        ok = delimitadores[i] == valor ? true : false;
        if (ok) {
            break;
        }
    }
    return ok;
}

public String retornaFormato(){

    String formato = "";
    for (int i = 0; i <= elementos.length-1; i++) {
          formato += elementos[i];             
      }

    return formato;
}

}[/code]

Cara, eu acho que misturar assim fica meio confuso… seria mais facil se voce utilizasse alguma classe Stack que já está implementada no Java (vide Stack - Java 6 )

Se, por algum motivo (professor/curso/interesse) voce tenha que implementar uma pilha, faça isso separado também, tipo uma classe Pilha que apenas faz as funções da pilha (empilha(x), desempilha(), estaCheia(), verTopo() {retorna o valor do topo sem desempilhar, quantidadeElementos() e assim vai, de acordo com sua necessidade)

E a classe Expressao vai ter uma Pilha, e os métodos para validar/testar/manipular a expressão :stuck_out_tongue:

Outra coisa é definir o que classifica uma expressão como válida, tipo, pode conter incógnitas? ou só podem ter operadores e números? dependendo do caso a validação será diferente…

Na minha opinião, uma validação seria primeiro verificar se o “aninhamento” está correto, tipo assim abre um colchete e depois um parêntesis, então tem que fechar o parêntesis e depois o colchete… Para isso, eu faria 2 vetores, um com caracteres de abertura e um com os de fechamento, daí voce percorre a expressão e toda vez que encontrar uma abertura voce a empilha, e toda vez que encontrar um de fechamento desempilha e compara ( o fechamento deve ser correspondente a abertura do topo da pilha )
Depois de verificado o aninhamento, verifica se os operadores ( ±*/^ ) estão corretos, tipo, cada operador deve estar entre duas expressões ( números ou blocos de parêntesis, colchetes etc )

[quote=drigo.angelo]
Se, por algum motivo (professor/curso/interesse) voce tenha que implementar uma pilha, faça isso separado também, tipo uma classe Pilha que apenas faz as funções da pilha (empilha(x), desempilha(), estaCheia(), verTopo() {retorna o valor do topo sem desempilhar, quantidadeElementos() e assim vai, de acordo com sua necessidade)

E a classe Expressao vai ter uma Pilha, e os métodos para validar/testar/manipular a expressão :P[/quote]

você poderia dar um exemplo prático de como fazer a pilha no codigo acima?

[quote=drigo.angelo] Para isso, eu faria 2 vetores, um com caracteres de abertura e um com os de fechamento, daí voce percorre a expressão e toda vez que encontrar uma abertura voce a empilha, e toda vez que encontrar um de fechamento desempilha e compara ( o fechamento deve ser correspondente a abertura do topo da pilha )
Depois de verificado o aninhamento, verifica se os operadores ( ±*/^ ) estão corretos, tipo, cada operador deve estar entre duas expressões ( números ou blocos de parêntesis, colchetes etc )[/quote]

Eu consegui entender o raciocinio do que você descreve acima, mas não estou conseguindo colocar em prática, poderia dar uma ajuda e implementar isso no código?