Pilha: delimitadores ( e ]

9 respostas
J

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!

9 Respostas

J

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

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

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

B

Muito bom!

Criado 10 de outubro de 2008
Ultima resposta 10 de out. de 2008
Respostas 9
Participantes 5