Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Pilha | Estruturas de Dados Adicionais
Estruturas de Dados em Java

bookPilha

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

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

main.java

copy
12345678910111213141516
package com.example; import java.util.Vector; public class Main { public static void main(String[] args) { Vector<String> vector = new Vector<>(); // Adding an element (this method is deprecated) vector.addElement("Item"); // Compiler warning about the deprecated method // Note: 'addElement(java.lang.Object)' is deprecated. System.out.println(vector.get(0)); } }

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

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

main.java

copy
123456789101112
package com.example; import java.util.Stack; public class Main { public static void main(String[] args) { Stack<String> stack = new Stack<>(); stack.push("One"); stack.push("Two"); System.out.println("Stack: " + stack); } }

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

main.java

copy
1234567891011121314
package com.example; import java.util.Stack; public class Main { public static void main(String[] args) { Stack<String> stack = new Stack<>(); stack.push("One"); stack.push("Two"); System.out.println("Stack: " + stack); stack.pop(); System.out.println("Stack after the `pop()` method: " + stack); } }

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

main.java

copy
123456789101112131415
package com.example; import java.util.Stack; public class Main { public static void main(String[] args) { Stack<String> stack = new Stack<>(); stack.push("One"); stack.push("Two"); System.out.println("Stack: " + stack); String top = stack.peek(); System.out.println("Top element of the stack: " + top); System.out.println("Stack after the `peek()` method: " + stack); } }

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:

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:

BrowserHistory.java

BrowserHistory.java

copy
1234567891011121314151617181920212223242526
import java.util.Stack; public class BrowserHistory { private Stack<String> backStack; private Stack<String> forwardStack; private String currentUrl; public BrowserHistory() { backStack = new Stack<>(); forwardStack = new Stack<>(); currentUrl = "https://codefinity.com/profile/my-home"; } public void visitPage(String url) { // When visiting a new page, add the current page to the "back" stack backStack.push(currentUrl); // Reset the "forward" stack as we moved to a new page forwardStack.clear(); // Set the current page to the new URL currentUrl = url; System.out.println("Visited page: " + url); } }
  • 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:
BrowserHistory.java

BrowserHistory.java

copy
12345678910
public void goBack() { if (!backStack.isEmpty()) { // Navigate to the previous page, move from the backStack to the forwardStack forwardStack.push(currentUrl); currentUrl = backStack.pop(); System.out.println("Went back to: " + currentUrl); } else { System.out.println("Cannot go back. Already at the beginning."); } }
  • 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:

BrowserHistory.java

BrowserHistory.java

copy
12345678910
public void goForward() { if (!forwardStack.isEmpty()) { // Navigate to the next page, move from the forwardStack to the backStack backStack.push(currentUrl); currentUrl = forwardStack.pop(); System.out.println("Went forward to: " + currentUrl); } else { System.out.println("Cannot go forward. Already at the latest page."); } }
  • 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:

Main.java

Main.java

copy
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
package com.example; import java.util.Stack; class Main { public static void main(String[] args) { BrowserHistory browser = new BrowserHistory(); System.out.println("Default page: " + browser.getCurrentPage()); browser.visitPage("https://codefinity.com/courses/tracks/7dfbcd35-5cde-49d3-80f1-bf1096487903"); browser.visitPage("https://codefinity.com/courses/v2/8204075c-f832-4cb9-88b1-4e24e74ebdcb/bb00e195-715e-477d-8927-964e6e27cf16/e66c57b4-5f36-43b2-bd3b-e1398044fcab"); browser.visitPage("https://codefinity.com/courses/v2/8204075c-f832-4cb9-88b1-4e24e74ebdcb/bb00e195-715e-477d-8927-964e6e27cf16/1585fb29-47cd-47a6-9fb3-5b391cad24e0"); System.out.println("Current Page after visiting 3 pages: " + browser.getCurrentPage()); browser.goBack(); browser.goBack(); System.out.println("Current Page after going back 2 times: " + browser.getCurrentPage()); browser.goForward(); System.out.println("Current Page after going forward: " + browser.getCurrentPage()); } } class BrowserHistory { private Stack<String> backStack; private Stack<String> forwardStack; private String currentUrl; public BrowserHistory() { backStack = new Stack<>(); forwardStack = new Stack<>(); currentUrl = "https://codefinity.com/profile/my-home"; } public void visitPage(String url) { // When visiting a new page, add the current page to the "back" stack backStack.push(currentUrl); // Reset the "forward" stack as we moved to a new page forwardStack.clear(); // Set the current page to the new URL currentUrl = url; System.out.println("Visited page: " + url); } public void goBack() { if (!backStack.isEmpty()) { // Navigate to the previous page, move from the backStack to the forwardStack forwardStack.push(currentUrl); currentUrl = backStack.pop(); System.out.println("Went back to: " + currentUrl); } else { System.out.println("Cannot go back. Already at the beginning."); } } public void goForward() { if (!forwardStack.isEmpty()) { // Navigate to the next page, move from the forwardStack to the backStack backStack.push(currentUrl); currentUrl = forwardStack.pop(); System.out.println("Went forward to: " + currentUrl); } else { System.out.println("Cannot go forward. Already at the latest page."); } } public String getCurrentPage() { return currentUrl; } }

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á?

question mark

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

Select the correct answer

question mark

Qual interface Java a classe Stack implementa?

Select the correct answer

question mark

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

Select the correct answer

question mark

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

Select the correct answer

question mark

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

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 2. Capítulo 4

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Suggested prompts:

What are the main differences between Stack and Deque in Java?

Can you show an example of implementing the same browser history using Deque?

Why is Stack considered obsolete in modern Java development?

Awesome!

Completion rate improved to 4

bookPilha

Deslize para mostrar o menu

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

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

main.java

copy
12345678910111213141516
package com.example; import java.util.Vector; public class Main { public static void main(String[] args) { Vector<String> vector = new Vector<>(); // Adding an element (this method is deprecated) vector.addElement("Item"); // Compiler warning about the deprecated method // Note: 'addElement(java.lang.Object)' is deprecated. System.out.println(vector.get(0)); } }

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

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

main.java

copy
123456789101112
package com.example; import java.util.Stack; public class Main { public static void main(String[] args) { Stack<String> stack = new Stack<>(); stack.push("One"); stack.push("Two"); System.out.println("Stack: " + stack); } }

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

main.java

copy
1234567891011121314
package com.example; import java.util.Stack; public class Main { public static void main(String[] args) { Stack<String> stack = new Stack<>(); stack.push("One"); stack.push("Two"); System.out.println("Stack: " + stack); stack.pop(); System.out.println("Stack after the `pop()` method: " + stack); } }

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

main.java

copy
123456789101112131415
package com.example; import java.util.Stack; public class Main { public static void main(String[] args) { Stack<String> stack = new Stack<>(); stack.push("One"); stack.push("Two"); System.out.println("Stack: " + stack); String top = stack.peek(); System.out.println("Top element of the stack: " + top); System.out.println("Stack after the `peek()` method: " + stack); } }

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:

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:

BrowserHistory.java

BrowserHistory.java

copy
1234567891011121314151617181920212223242526
import java.util.Stack; public class BrowserHistory { private Stack<String> backStack; private Stack<String> forwardStack; private String currentUrl; public BrowserHistory() { backStack = new Stack<>(); forwardStack = new Stack<>(); currentUrl = "https://codefinity.com/profile/my-home"; } public void visitPage(String url) { // When visiting a new page, add the current page to the "back" stack backStack.push(currentUrl); // Reset the "forward" stack as we moved to a new page forwardStack.clear(); // Set the current page to the new URL currentUrl = url; System.out.println("Visited page: " + url); } }
  • 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:
BrowserHistory.java

BrowserHistory.java

copy
12345678910
public void goBack() { if (!backStack.isEmpty()) { // Navigate to the previous page, move from the backStack to the forwardStack forwardStack.push(currentUrl); currentUrl = backStack.pop(); System.out.println("Went back to: " + currentUrl); } else { System.out.println("Cannot go back. Already at the beginning."); } }
  • 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:

BrowserHistory.java

BrowserHistory.java

copy
12345678910
public void goForward() { if (!forwardStack.isEmpty()) { // Navigate to the next page, move from the forwardStack to the backStack backStack.push(currentUrl); currentUrl = forwardStack.pop(); System.out.println("Went forward to: " + currentUrl); } else { System.out.println("Cannot go forward. Already at the latest page."); } }
  • 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:

Main.java

Main.java

copy
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
package com.example; import java.util.Stack; class Main { public static void main(String[] args) { BrowserHistory browser = new BrowserHistory(); System.out.println("Default page: " + browser.getCurrentPage()); browser.visitPage("https://codefinity.com/courses/tracks/7dfbcd35-5cde-49d3-80f1-bf1096487903"); browser.visitPage("https://codefinity.com/courses/v2/8204075c-f832-4cb9-88b1-4e24e74ebdcb/bb00e195-715e-477d-8927-964e6e27cf16/e66c57b4-5f36-43b2-bd3b-e1398044fcab"); browser.visitPage("https://codefinity.com/courses/v2/8204075c-f832-4cb9-88b1-4e24e74ebdcb/bb00e195-715e-477d-8927-964e6e27cf16/1585fb29-47cd-47a6-9fb3-5b391cad24e0"); System.out.println("Current Page after visiting 3 pages: " + browser.getCurrentPage()); browser.goBack(); browser.goBack(); System.out.println("Current Page after going back 2 times: " + browser.getCurrentPage()); browser.goForward(); System.out.println("Current Page after going forward: " + browser.getCurrentPage()); } } class BrowserHistory { private Stack<String> backStack; private Stack<String> forwardStack; private String currentUrl; public BrowserHistory() { backStack = new Stack<>(); forwardStack = new Stack<>(); currentUrl = "https://codefinity.com/profile/my-home"; } public void visitPage(String url) { // When visiting a new page, add the current page to the "back" stack backStack.push(currentUrl); // Reset the "forward" stack as we moved to a new page forwardStack.clear(); // Set the current page to the new URL currentUrl = url; System.out.println("Visited page: " + url); } public void goBack() { if (!backStack.isEmpty()) { // Navigate to the previous page, move from the backStack to the forwardStack forwardStack.push(currentUrl); currentUrl = backStack.pop(); System.out.println("Went back to: " + currentUrl); } else { System.out.println("Cannot go back. Already at the beginning."); } } public void goForward() { if (!forwardStack.isEmpty()) { // Navigate to the next page, move from the forwardStack to the backStack backStack.push(currentUrl); currentUrl = forwardStack.pop(); System.out.println("Went forward to: " + currentUrl); } else { System.out.println("Cannot go forward. Already at the latest page."); } } public String getCurrentPage() { return currentUrl; } }

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á?

question mark

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

Select the correct answer

question mark

Qual interface Java a classe Stack implementa?

Select the correct answer

question mark

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

Select the correct answer

question mark

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

Select the correct answer

question mark

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

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

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