Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Pilha | Additional Data Structures
Java Data Structures

PilhaPilha

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

Deprecated is a status assigned to a method, class, interface, or other programming element to indicate that this element is considered outdated and may be removed in future versions. It serves as a warning to developers that the use of this element is not recommended, and they should consider using more modern alternatives.

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:

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

A 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.
java

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.
java

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.
java

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

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ável String que armazena o link da página atual.
  • Nesta classe, haverá quatro métodos: visitPage(), goBack(), goForward() e getCurrentPage(). 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. A forwardStack será limpa, visto que estamos nos movendo para uma nova página. Vamos ver a implementação no código:
java

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 da backStack e o atribuímos a currentUrl. Vejamos a implementação no código:
java

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ável currentUrl. Também verificamos para garantir que a backStack 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:
java

BrowserHistory.java

  • Agora, tudo o que resta é implementar o método getCurrentPage(), que simplesmente retornará o valor de currentUrl.

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:

java

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!

1. Qual é o princípio principal de uma estrutura de dados do tipo `Pilha`?
2. Qual interface Java a classe `Stack` implementa?
3. Qual é o método utilizado para adicionar um elemento ao topo da pilha em Java?
4. Qual das seguintes coleções Java é considerada uma alternativa mais moderna para `Stack`?
5. No Java, o que o método `pop()` de um `Stack` retornará?

Qual é o princípio principal de uma estrutura de dados do tipo Pilha?

Selecione a resposta correta

Qual interface Java a classe Stack implementa?

Selecione a resposta correta

Qual é o método utilizado para adicionar um elemento ao topo da pilha em Java?

Selecione a resposta correta

Qual das seguintes coleções Java é considerada uma alternativa mais moderna para Stack?

Selecione a resposta correta

No Java, o que o método pop() de um Stack retornará?

Selecione a resposta correta

Tudo estava claro?

Seção 2. Capítulo 4
course content

Conteúdo do Curso

Java Data Structures

PilhaPilha

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

Deprecated is a status assigned to a method, class, interface, or other programming element to indicate that this element is considered outdated and may be removed in future versions. It serves as a warning to developers that the use of this element is not recommended, and they should consider using more modern alternatives.

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:

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

A 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.
java

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.
java

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.
java

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

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ável String que armazena o link da página atual.
  • Nesta classe, haverá quatro métodos: visitPage(), goBack(), goForward() e getCurrentPage(). 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. A forwardStack será limpa, visto que estamos nos movendo para uma nova página. Vamos ver a implementação no código:
java

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 da backStack e o atribuímos a currentUrl. Vejamos a implementação no código:
java

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ável currentUrl. Também verificamos para garantir que a backStack 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:
java

BrowserHistory.java

  • Agora, tudo o que resta é implementar o método getCurrentPage(), que simplesmente retornará o valor de currentUrl.

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:

java

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!

1. Qual é o princípio principal de uma estrutura de dados do tipo `Pilha`?
2. Qual interface Java a classe `Stack` implementa?
3. Qual é o método utilizado para adicionar um elemento ao topo da pilha em Java?
4. Qual das seguintes coleções Java é considerada uma alternativa mais moderna para `Stack`?
5. No Java, o que o método `pop()` de um `Stack` retornará?

Qual é o princípio principal de uma estrutura de dados do tipo Pilha?

Selecione a resposta correta

Qual interface Java a classe Stack implementa?

Selecione a resposta correta

Qual é o método utilizado para adicionar um elemento ao topo da pilha em Java?

Selecione a resposta correta

Qual das seguintes coleções Java é considerada uma alternativa mais moderna para Stack?

Selecione a resposta correta

No Java, o que o método pop() de um Stack retornará?

Selecione a resposta correta

Tudo estava claro?

Seção 2. Capítulo 4
some-alt