0% acharam este documento útil (0 voto)
8 visualizações18 páginas

Pilha

Como tratar pilha de dados

Enviado por

giovanebarcelos
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
8 visualizações18 páginas

Pilha

Como tratar pilha de dados

Enviado por

giovanebarcelos
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

Pilha (Stack)

O que é uma Pilha?


➢ Uma estrutura de dados linear que segue o princípio LIFO (Last In, First
Out), ou seja, o último elemento inserido é o primeiro a ser removido
➢ Exemplo: uma pilha de pratos → o último prato colocado é o primeiro a
ser retirado

Pág. 1 De 18
Pilha (Stack)
Operações básicas de uma pilha
1) Push (Empilhar) → Adiciona um elemento no topo da pilha
2) Pop (Desempilhar) → Remove o elemento do topo da pilha
3) Peek (Topo) → Retorna o elemento no topo sem removê-lo
4) isEmpty (Vazia?) → Verifica se a pilha está vazia.
5) Size (Tamanho) → Retorna o número de elementos da pilha

Pág. 2 De 18
Pilha (Stack)
Tipos de Implementação de Pilha
➢ Existem três tipos principais de implementação de pilha:
✔ Sequencial baseada em Array
✔ Encadeada baseada em Lista Ligada
✔ Genérica baseada em Generics

Pág. 3 De 18
Pilha (Stack)
Pilha Sequencial (Baseada em Array)
➢ Implementada com um array
➢ Possui tamanho fixo, definido no momento da criação
➢ Rápida, pois utiliza índices diretos para manipulação de dados
➢ Desvantagem: não cresce dinamicamente, podendo levar a desperdício
de memória ou estouro de capacidade

Pág. 4 De 18
Pilha (Stack)
Exemplo: Implementação de Pilha Sequencial com Array
public class TestePilhaSequencial {
public static void main(String[] args) {
PilhaSequencial pilha = new PilhaSequencial(3);
pilha.push(10);
pilha.push(20);
pilha.push(30);

System.out.println("Topo: " + pilha.peek());


System.out.println("Removendo: " + pilha.pop());
System.out.println("Topo após remoção: " + pilha.peek());
}
}

Pág. 5 De 18
Pilha (Stack)
Exemplo: Implementação de Pilha Sequencial com Array
class PilhaSequencial {
private int topo;
private int[] elementos;
public PilhaSequencial(int capacidade) {
this.elementos = new int[capacidade];
this.topo = -1;
}
public void push(int elemento) {
if (topo == elementos.length - 1) {
System.out.println("Pilha cheia! Não é possível adicionar " + elemento);
return;
}
elementos[++topo] = elemento;
}
Pág. 6 De 18
Pilha (Stack)
Exemplo: Implementação de Pilha Sequencial com Array
public int pop() {
if (isEmpty()) {
throw new RuntimeException("Pilha vazia! Não há elementos para remover.");
}
return elementos[topo--];
}
public int peek() {
if (isEmpty()) {
throw new RuntimeException("Pilha vazia!");
}
return elementos[topo];
}
public boolean isEmpty() {
return topo == -1;
}
}
Pág. 7 De 18
Pilha (Stack)
Pilha Encadeada (Baseada em Lista Ligada)
➢ Implementada com nós (nodes) encadeados, onde cada nó aponta para
o próximo
➢ Não possui limite de tamanho (só depende da memória disponível)
➢ Operações de push e pop são feitas no início da lista
➢ Mais flexível, mas ocupa mais memória devido ao ponteiro extra em
cada nó.

Pág. 8 De 18
Pilha (Stack)
Exemplo: Implementação de Pilha Encadeada
public class TestePilhaEncadeada {
public static void main(String[] args) {
PilhaEncadeada pilha = new PilhaEncadeada();
pilha.push(5);
pilha.push(10);
pilha.push(15);

System.out.println("Topo: " + pilha.peek());


System.out.println("Removendo: " + pilha.pop());
System.out.println("Topo após remoção: " + pilha.peek());
}
}

Pág. 9 De 18
Pilha (Stack)
Exemplo: Implementação de Pilha Encadeada
class No {
int dado;
No proximo;

public No(int dado) {


this.dado = dado;
this.proximo = null;
}
}

Pág. 10 De 18
Pilha (Stack)
Exemplo: Implementação de Pilha Encadeada
class PilhaEncadeada {
private No topo;

public PilhaEncadeada() {
this.topo = null;
}

public void push(int elemento) {


No novoNo = new No(elemento);
novoNo.proximo = topo;
topo = novoNo;
}

Pág. 11 De 18
Pilha (Stack)
Exemplo: Implementação de Pilha Encadeada
public int pop() {
if (isEmpty()) { throw new RuntimeException("Pilha vazia!"); }
int removido = topo.dado;
topo = topo.proximo;
return removido;
}
public int peek() {
if (isEmpty()) { throw new RuntimeException("Pilha vazia!"); }
return topo.dado;
}
public boolean isEmpty() {
return topo == null;
}
}
Pág. 12 De 18
Pilha (Stack)
Pilha Genérica (Baseada em Generics)
➢ Utiliza parâmetros genéricos (`<T>`) para armazenar diferentes tipos
de dados
➢ Flexível, podendo ser utilizada para qualquer tipo de objeto
➢ Pode ser implementada tanto sequencialmente (array) quanto
encadeada (lista ligada)

Pág. 13 De 18
Pilha (Stack)
Exemplo: Implementação de Pilha Genérica
public class TestePilhaGenerica {
public static void main(String[] args) {
PilhaGenerica<String> pilhaString = new PilhaGenerica<>(5);
pilhaString.push("A");
pilhaString.push("B");
pilhaString.push("C");

System.out.println("Topo da pilha de Strings: " + pilhaString.peek());

PilhaGenerica<Integer> pilhaInteiros = new PilhaGenerica<>(5);


pilhaInteiros.push(1);
pilhaInteiros.push(2);
pilhaInteiros.push(3);
System.out.println("Topo da pilha de Inteiros: " + pilhaInteiros.peek());
}
}
Pág. 14 De 18
Pilha (Stack)
Exemplo: Implementação de Pilha Genérica
class PilhaGenerica<T> {
private Object[] elementos;
private int topo;

public PilhaGenerica(int capacidade) {


this.elementos = new Object[capacidade];
this.topo = -1;
}

public void push(T elemento) {


if (topo == elementos.length - 1) {
throw new RuntimeException("Pilha cheia!");
}
elementos[++topo] = elemento;
}

Pág. 15 De 18
Pilha (Stack)
Exemplo: Implementação de Pilha Genérica
@SuppressWarnings("unchecked")
public T pop() {
if (isEmpty()) { throw new RuntimeException("Pilha vazia!"); }
return (T) elementos[topo--];
}

@SuppressWarnings("unchecked")
public T peek() {
if (isEmpty()) { throw new RuntimeException("Pilha vazia!"); }
return (T) elementos[topo];
}

public boolean isEmpty() {


return topo == -1;
}
}
Pág. 16 De 18
Pilha (Stack)
Conclusão

Tipo de Pilha Vantagens Desvantagens


Sequencial (Array) Acesso rápido, simples de Tamanho fixo, pode
implementar desperdiçar memória
Encadeada (Lista Ligada) Cresce dinamicamente, Usa mais memória
não há limite de tamanho (ponteiros extras)
Genérica (`<T>`) Armazena qualquer tipo Pode ter desempenho reduzido pelo casting
de dado, reutilizável

➢ A pilha é uma estrutura fundamental, usada em recursão, histórico de


navegação, expressões matemáticas e mais
➢ A escolha entre pilha sequencial, encadeada ou genérica depende do
caso de uso

Pág. 17 De 18
Lembre-se

“ Stack overflow error ”

Pág. 18 De 18

Você também pode gostar