Estrutura de dados: Pilhas, o que são e como usá-las

Bom dia(ou quase boa tarde rs) galera !!! Então venho aqui deixar uma pergunta sobre estrutura de dados, mais precisamente sobre Pilhas: o que são as tais pilhas e como posso usá-las ?

Tiozinho, só uma coisinha - é uma lista que você tem de entregar e quer a resposta pronta, sem copiá-la da sua apostila? Só por curiosidade.

Imagine a pia da sua casa.
Você pega um prato sujo e coloca la dentro, depois vc pega outro prato sujo, e joga lá também, e você vai jogando pratos lá, até formar uma pilha de pratos, qual você vai lavar primeiro?
O primeiro que você colocou ou o último? Lógicamente você pega o ultimo e lava, então, o primeiro que entra, é o ultimo que sai, isso é pilha (LIFO).

Não, na verdade eu tenho que fazer uma espécie de seminário: explicar o conceito e desenvolver o algorítimo entendeu? Por isso vim aqui fazer as duas perguntas, visto que o professor não explicou nada( nada mesmo) sobre isso.

[quote] Imagine a pia da sua casa.
Você pega um prato sujo e coloca la dentro, depois vc pega outro prato sujo, e joga lá também, e você vai jogando pratos lá, até formar uma pilha de pratos, qual você vai lavar primeiro?
O primeiro que você colocou ou o último? Lógicamente você pega o ultimo e lava, então, o primeiro que entra, é o ultimo que sai, isso é pilha (LIFO).[/quote]

Valeu cara, eu tinha acabado de entrar em uma site ( http://www.ime.usp.br/~pf/algoritmos/aulas/pilha.html) e ele explicava isso da mesma forma !!! Então caso, pilha é um conceito ?

Se for o Mr. Bean provavelmente iria pegar o primeiro lá no fundo da pilha, e iria acabar quebrando os pratos (e tentando escondê-los em algum lugar).

Para que o Mr. Bean não quebre mais pratos, existe uma estrutura que se chama em inglês “deque” (implementada em Java como http://docs.oracle.com/javase/6/docs/api/java/util/Deque.html ).

Não exatamente.

Uma pilha pode ser implementada com um vetor, mas na verdade é qualquer estrutura de dados onde você normalmente só trabalha com os elementos do topo.

Você pode implementar uma pilha com uma lista ligada, por exemplo.

Você pode até criar uma pilha implementada como uma lista de vetores, por exemplo (imagine que a pilha de pratos na sua pia tenha ficado tão grande que você a dividiu em várias, mas você vai respeitar uma determinada ordem e só pegar o último prato que você empilhou para lavar). Contanto que você sempre só trabalhe com os elementos do topo, ela continua sendo uma pilha.

Entendi, eu coloquei como conceito de vetor porém depois percebi o erro e editei. Muito obrigado, e desculpe se causei duvidas em você pensando que eu queria que fizesse meu trabalho por mim, não sou de fazer isso não pode ficar tranquilo, aliás do que adianta eu ser um profissional diplomado e não ser produtivo não é? Até outra hora !!!

na realidade vetor é uma boa base para armazenamento da pilha.
bastava sabermos onde está atualmente o topo da pilha.

se olharmos vamos notar q para uma lista ele já não seria o ideal.
pq na remoção/inserção de um elemento no inicio/meio, obrigaria a movimentação de tds elementos posteriores.
coisa não acontece com a pilha.

só pra ajudar a clarear o entendimento “prático”.

você só vai entender o conceito, depois de implementar uma pilha funcional

pode ser uma classe com um atributo elementos elementos[];

com alguns métodos:

public elemento inserir(elemento e){} //push (move os elementos 1 casa para frente do vetor +1, deixando o campo [0] vazio, e então atribui o objeto no vetor)
public elemento remover(){} //pop (move os elementos 1 casa para traz -1, exceto o primeiro elemento)
public elemento getElemento() //peek (apenar retorna o primeiro elemento [0])

tudo isso ja esta implementado na classe Stack do java, mas é necessário entender o conceito.

[quote=douglaskd]você só vai entender o conceito, depois de implementar uma pilha funcional

pode ser uma classe com um atributo elementos elementos[];

com alguns métodos:

public elemento inserir(elemento e){} //push (move os elementos 1 casa para frente do vetor +1, deixando o campo [0] vazio, e então atribui o objeto no vetor)
public elemento remover(){} //pop (move os elementos 1 casa para traz -1, exceto o primeiro elemento)
public elemento getElemento() //peek (apenar retorna o primeiro elemento [0])

tudo isso ja esta implementado na classe Stack do java, mas é necessário entender o conceito.[/quote]

Cara, acho que vc se confundiu aí. ^^

A classe Stack extende Vector, e então oferece alguns métodos para “criar” e manipularuma pilha.
Os elementos não são realocados. O push simplesmente adiciona o elemento no final do vetor,
pop retorna o último elemento, removendo-o do vetor e peek retorna o último elemento, mantendo-o no vetor.

[quote=felipeaps][quote=douglaskd]você só vai entender o conceito, depois de implementar uma pilha funcional

pode ser uma classe com um atributo elementos elementos[];

com alguns métodos:

public elemento inserir(elemento e){} //push (move os elementos 1 casa para frente do vetor +1, deixando o campo [0] vazio, e então atribui o objeto no vetor)
public elemento remover(){} //pop (move os elementos 1 casa para traz -1, exceto o primeiro elemento)
public elemento getElemento() //peek (apenar retorna o primeiro elemento [0])

tudo isso ja esta implementado na classe Stack do java, mas é necessário entender o conceito.[/quote]

Cara, acho que vc se confundiu aí. ^^

A classe Stack extende Vector, e então oferece alguns métodos para “criar” e manipularuma pilha.
Os elementos não são realocados. O push simplesmente adiciona o elemento no final do vetor,
pop retorna o último elemento, removendo-o do vetor e peek retorna o último elemento, mantendo-o no vetor.[/quote]

tem razão…