Pilha
Uma Stack
é outra estrutura de dados que opera no princípio Último a Entrar, Primeiro a Sair (LIFO). O mesmo princípio pode ser aplicado a um Deque
, que você aprendeu anteriormente, e desenvolvedores Java recomendam usar Deque
se houver necessidade de uma estrutura de dados que opere no princípio LIFO. A estrutura de dados Stack
está obsoleta.
Obsoleto
![](https://codefinity-content-media.s3.eu-west-1.amazonaws.com/Java_OOP/Definition_1.png)
Quando um elemento é marcado como obsoleto, significa que os autores da biblioteca ou linguagem de programação aconselham evitar o seu uso em novos códigos e recomendam a adoção de métodos, classes ou abordagens novas que possam fornecer soluções mais seguras, eficientes ou funcionais.
Um exemplo é a classe Vector
em Java. Seus métodos foram depreciados em favor de coleções mais modernas como ArrayList
e LinkedList
. Se um programador ainda utiliza métodos Vector
, o compilador pode emitir um aviso de que esses métodos estão depreciados.
Exemplo em Java:
main.java
Portanto, não é recomendado usar uma estrutura de dados como Pilha (Stack), mas discutiremos isso neste capítulo porque é uma estrutura de dados interessante, utilizada, por exemplo, na memória Stack do Java.
Pilha
![](https://codefinity-content-media.s3.eu-west-1.amazonaws.com/Java_OOP/Definition_1.png)
Stack
is a data structure representing an ordered collection of elements where the addition and removal of elements occur at one end, called the stack's top. This operating principle is known as "Last In, First Out" (LIFO) - the last added element is the first to be removed.
Direto ao assunto, vamos olhar os métodos da classe Stack
:
Métodos
push(E element)
(adição): Adiciona um elemento no topo da pilha.
main.java
Adicionar é feito da mesma forma que em ArrayList
, então vamos olhar imediatamente este método em combinação com o método pop()
:
pop()
: Remove e retorna o elemento do topo da pilha.
main.java
Este método remove um elemento do topo da pilha. Observe que o método pop()
elimina o elemento adicionado por último da pilha. É exatamente assim que o princípio LIFO (Last In, First Out - Último a Entrar, Primeiro a Sair) funciona.
Também podemos verificar qual elemento está no topo da pilha:
- Peek: Retorna o elemento do topo da pilha sem removê-lo.
main.java
Com este método, verificamos o elemento do topo da pilha.
Uso
Vamos considerar um exemplo de utilização da estrutura de dados pilha para navegar entre páginas em um navegador (aqueles botões de avançar e voltar que frequentemente usamos).
Vamos planejar a implementação do histórico do navegador e implementar métodos para dois botões (goBack()
e goForward()
).
Se você não tem certeza de quais botões estou me referindo, estou falando sobre estes botões:
![content](https://codefinity-content-media-v2.s3.eu-west-1.amazonaws.com/courses/190d2568-3d25-44d0-832f-da03468004c9/navigation_buttons.jpg)
Vamos implementar uma classe que possui métodos para operar estes dois botões, utilizando a estrutura de dados Stack
.
Como vai funcionar:
- Teremos duas pilhas e uma variável
String
. A primeira pilha vai armazenar os links que navegamos ao clicar na seta "back
". A segunda pilha vai armazenar os links que navegamos ao clicar na seta "forward
". Também teremos uma variávelString
que armazena o link da página atual. - Nesta classe, haverá quatro métodos:
visitPage()
,goBack()
,goForward()
egetCurrentPage()
. Vamos passar por eles passo a passo: - O método
visitPage()
irá nos redirecionar para a URL especificada no parâmetro. Ao nos movermos para uma nova página, o link antigo será adicionado àbackStack
. AforwardStack
será limpa, visto que estamos nos movendo para uma nova página. Vamos ver a implementação no código:
BrowserHistory.java
- Desta forma, podemos retornar à página anterior ao navegar para uma nova página.
Vamos implementar o método para voltar. Funcionará assim: adicionamos o link atual à
forwardStack
, depois removemos este link dabackStack
e o atribuímos acurrentUrl
. Vejamos a implementação no código:
BrowserHistory.java
- Eu vou lembrá-lo de que o método
pop()
remove o elemento do topo da pilha e o retorna. Portanto, ao usar este método, nós imediatamente atribuímos o valor da URL à variávelcurrentUrl
. Também verificamos para garantir que abackStack
não está vazia; caso contrário, não poderemos voltar ao link anterior (simplesmente porque ele não estará lá). Se a pilha estiver vazia, nós exibimos uma mensagem correspondente. - Da mesma forma, implementamos o método para navegar para a página seguinte. Nós simplesmente trocamos os elementos da pilha:
BrowserHistory.java
- Agora, tudo o que resta é implementar o método
getCurrentPage()
, que simplesmente retornará o valor decurrentUrl
.
Teste
A seguir, vamos testar tudo isso no método main
. Usaremos o método visitPage()
três vezes para garantir que esses links sejam salvos no histórico. Em seguida, usaremos o método goBack()
duas vezes, seguido do método goForward()
uma vez, para verificar a funcionalidade dos métodos escritos.
Durante esse processo, acompanharemos nosso estado usando o método getCurrentPage()
. Você pode executar o código abaixo e também tentar inserir mais links e usar diferentes métodos para testar a funcionalidade desta classe:
Main.java
Nota
Se o grande número de saídas no console é incômodo, você pode remover as operações de impressão no console dos métodos, deixando apenas as saídas intermediárias na tela.
Lembre-se de que a classe Stack
é obsoleta e é melhor usar Deque
em vez disso. Neste exemplo, Stack
é implementado baseado no princípio LIFO (último a entrar, primeiro a sair), e também podemos implementar Deque
, já que é uma fila de duas pontas que pode operar baseada nos princípios FIFO e LIFO (primeiro a entrar, primeiro a sair).
Se encontrar dificuldades para entender o exemplo ou o código em geral, sinta-se à vontade para clicar em "Não está claro?" e fazer sua pergunta. Farei o meu melhor para ajudá-lo a entender o material o mais rápido possível!
Além disso, não se esqueça de que você pode aproveitar o recurso "Conversar Com a Comunidade", onde usuários como você estão prontos para ajudá-lo!
Tudo estava claro?
Conteúdo do Curso
Java Data Structures
2. Estruturas de Dados Adicionais
Java Data Structures
Pilha
Uma Stack
é outra estrutura de dados que opera no princípio Último a Entrar, Primeiro a Sair (LIFO). O mesmo princípio pode ser aplicado a um Deque
, que você aprendeu anteriormente, e desenvolvedores Java recomendam usar Deque
se houver necessidade de uma estrutura de dados que opere no princípio LIFO. A estrutura de dados Stack
está obsoleta.
Obsoleto
![](https://codefinity-content-media.s3.eu-west-1.amazonaws.com/Java_OOP/Definition_1.png)
Quando um elemento é marcado como obsoleto, significa que os autores da biblioteca ou linguagem de programação aconselham evitar o seu uso em novos códigos e recomendam a adoção de métodos, classes ou abordagens novas que possam fornecer soluções mais seguras, eficientes ou funcionais.
Um exemplo é a classe Vector
em Java. Seus métodos foram depreciados em favor de coleções mais modernas como ArrayList
e LinkedList
. Se um programador ainda utiliza métodos Vector
, o compilador pode emitir um aviso de que esses métodos estão depreciados.
Exemplo em Java:
main.java
Portanto, não é recomendado usar uma estrutura de dados como Pilha (Stack), mas discutiremos isso neste capítulo porque é uma estrutura de dados interessante, utilizada, por exemplo, na memória Stack do Java.
Pilha
![](https://codefinity-content-media.s3.eu-west-1.amazonaws.com/Java_OOP/Definition_1.png)
Stack
is a data structure representing an ordered collection of elements where the addition and removal of elements occur at one end, called the stack's top. This operating principle is known as "Last In, First Out" (LIFO) - the last added element is the first to be removed.
Direto ao assunto, vamos olhar os métodos da classe Stack
:
Métodos
push(E element)
(adição): Adiciona um elemento no topo da pilha.
main.java
Adicionar é feito da mesma forma que em ArrayList
, então vamos olhar imediatamente este método em combinação com o método pop()
:
pop()
: Remove e retorna o elemento do topo da pilha.
main.java
Este método remove um elemento do topo da pilha. Observe que o método pop()
elimina o elemento adicionado por último da pilha. É exatamente assim que o princípio LIFO (Last In, First Out - Último a Entrar, Primeiro a Sair) funciona.
Também podemos verificar qual elemento está no topo da pilha:
- Peek: Retorna o elemento do topo da pilha sem removê-lo.
main.java
Com este método, verificamos o elemento do topo da pilha.
Uso
Vamos considerar um exemplo de utilização da estrutura de dados pilha para navegar entre páginas em um navegador (aqueles botões de avançar e voltar que frequentemente usamos).
Vamos planejar a implementação do histórico do navegador e implementar métodos para dois botões (goBack()
e goForward()
).
Se você não tem certeza de quais botões estou me referindo, estou falando sobre estes botões:
![content](https://codefinity-content-media-v2.s3.eu-west-1.amazonaws.com/courses/190d2568-3d25-44d0-832f-da03468004c9/navigation_buttons.jpg)
Vamos implementar uma classe que possui métodos para operar estes dois botões, utilizando a estrutura de dados Stack
.
Como vai funcionar:
- Teremos duas pilhas e uma variável
String
. A primeira pilha vai armazenar os links que navegamos ao clicar na seta "back
". A segunda pilha vai armazenar os links que navegamos ao clicar na seta "forward
". Também teremos uma variávelString
que armazena o link da página atual. - Nesta classe, haverá quatro métodos:
visitPage()
,goBack()
,goForward()
egetCurrentPage()
. Vamos passar por eles passo a passo: - O método
visitPage()
irá nos redirecionar para a URL especificada no parâmetro. Ao nos movermos para uma nova página, o link antigo será adicionado àbackStack
. AforwardStack
será limpa, visto que estamos nos movendo para uma nova página. Vamos ver a implementação no código:
BrowserHistory.java
- Desta forma, podemos retornar à página anterior ao navegar para uma nova página.
Vamos implementar o método para voltar. Funcionará assim: adicionamos o link atual à
forwardStack
, depois removemos este link dabackStack
e o atribuímos acurrentUrl
. Vejamos a implementação no código:
BrowserHistory.java
- Eu vou lembrá-lo de que o método
pop()
remove o elemento do topo da pilha e o retorna. Portanto, ao usar este método, nós imediatamente atribuímos o valor da URL à variávelcurrentUrl
. Também verificamos para garantir que abackStack
não está vazia; caso contrário, não poderemos voltar ao link anterior (simplesmente porque ele não estará lá). Se a pilha estiver vazia, nós exibimos uma mensagem correspondente. - Da mesma forma, implementamos o método para navegar para a página seguinte. Nós simplesmente trocamos os elementos da pilha:
BrowserHistory.java
- Agora, tudo o que resta é implementar o método
getCurrentPage()
, que simplesmente retornará o valor decurrentUrl
.
Teste
A seguir, vamos testar tudo isso no método main
. Usaremos o método visitPage()
três vezes para garantir que esses links sejam salvos no histórico. Em seguida, usaremos o método goBack()
duas vezes, seguido do método goForward()
uma vez, para verificar a funcionalidade dos métodos escritos.
Durante esse processo, acompanharemos nosso estado usando o método getCurrentPage()
. Você pode executar o código abaixo e também tentar inserir mais links e usar diferentes métodos para testar a funcionalidade desta classe:
Main.java
Nota
Se o grande número de saídas no console é incômodo, você pode remover as operações de impressão no console dos métodos, deixando apenas as saídas intermediárias na tela.
Lembre-se de que a classe Stack
é obsoleta e é melhor usar Deque
em vez disso. Neste exemplo, Stack
é implementado baseado no princípio LIFO (último a entrar, primeiro a sair), e também podemos implementar Deque
, já que é uma fila de duas pontas que pode operar baseada nos princípios FIFO e LIFO (primeiro a entrar, primeiro a sair).
Se encontrar dificuldades para entender o exemplo ou o código em geral, sinta-se à vontade para clicar em "Não está claro?" e fazer sua pergunta. Farei o meu melhor para ajudá-lo a entender o material o mais rápido possível!
Além disso, não se esqueça de que você pode aproveitar o recurso "Conversar Com a Comunidade", onde usuários como você estão prontos para ajudá-lo!
Tudo estava claro?