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
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?