Ai pessoal, meu prof passou um desafio em java pra gente fazer
mais que eu naum tenho a mínima idéia de como se faz.
Ele quer que faça um programa com PILHA, que analise uma expressão
e empilhe um parenteses e/ou colchetes e veja se o usuario
esqueceu de fechar o parenteses e/ou colchetes.
Abaixo o enunciado
Faça um programa com pilha que dado uma expressão, verifique se um casamento de delimitadores.
Exemplos:
[ expressão: ((x+y)-(x-2)) ] ok
[expressão: [(x+y]) erro! ?)? era esperado!
[expressão: [(x+y) + (z*3) erro! ?]? era esperado!
Se alguem puder me ajudar, muito obrigado!
Valeu galera!
Tah dificil né galera? Eu tambem acho!
hehehe…
Mas se alguem puder ajudar, valeus!
Marky.Vasconcelos
Sobre pilhas eu te mandei no outro tópico.
Uma solução que eu vejo é primeiro remover todos os numeros e sinais (0-9±*/) depois trabalhar com o que restou na pilha da seguinte maneira
Adicione cada elemento na pilha, e se for um delimitador fechando ( ‘)’, ‘]’) voce verifica com o elemento interior para ver se é um delimitador do mesmo tipo abrindo ( ‘(’, ‘[’) se for continua fazendo isso, se não já se percebe um erro.
Marky.Vasconcelos
… só não espera respostas prontas aqui ^^
Mas não tenha medo de postar duvidas.
J
jalmat
Tipo…
Galera, naum quero nada pronto…
Apenas ajuda e idéias de como fazer, pois estou começando, e estou com muitas dificuldades!
Muito obrigado!
Valeus!
J
jalmat
E agora companheiro?
luistiagos
muito simples…
supoenhamos a seguinte situação teremos uma pilha p e 2 operações p.push(valor) coloca na pilha e p.pop() retira da pilha o elemento do topo dela e xpressão:
{[()]}
toda vez que encontrar-mos algo como {, [ ou ( iremos colocar na pilha e ao encontrar ), ] ou } iremos retirar da mesma bem vamos la iterando caractere por caractere:
{ p.push("{")
pilha: ["{"]
[ p.push("[")
pilha: ["{","["]
( p.push("(")
pilha: ["{","[","("]
) p.pop();
pilha: ["{","["]
] p.pop();
pilha: ["{"]
} p.pop();
pilha: []
pilha é vazia ? sim então esta correto!
agora se tivermos a expressão:
{[()]
{ p.push("{")
pilha: ["{"]
[ p.push("[")
pilha: ["{","["]
( p.push("(")
pilha: ["{","[","("]
) p.pop();
pilha: ["{","["]
] p.pop();
pilha: ["{"]
pilha é vazia ? não então não esta correto!
no final vc testa se sua pilha esta vazia ou não… se éla estiver vazia é pq esta certo senão esta errado sobrando ou faltando algum {} [] () ou coisa do genero
só lembre-se que a cada operador de fecho: })] vc deve comparar com o ultimo que esta na pilha caso for diferente ao seu respectivo abre ja esta errado de cara… cada abre deve ter seu correspondente fecha…
ViniGodoy
A idéia é simples.
Se encontrar (, [ ou { empilhe.
Se encontrar ), ] ou }, desempilhe e compare se o sinal desempilhado é o correspondente ao sinal que fecha que você acabou de encontrar. Por exemplo, se vc estiver num ], você tem que ter desempilhado o [. Se não for isso, está errado.
Ao final, a pilha também deve estar vazia. Se não estiver, significa que ele abriu algum sinal, mas não fechou.
PS: Postei junto com o LuisTiagos.
Marky.Vasconcelos
Eu ia posta um exemplo que nem o luistiagos mas tive serviço pra faze^^