estrutura de dados em java - pilhas

26
Estrutura de Dados Pilhas Prof. Adriano Teixeira de Souza

Upload: adriano-teixeira-de-souza

Post on 20-Jun-2015

9.129 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Estrutura de dados em Java - Pilhas

Estrutura de DadosPilhas

Prof. Adriano Teixeira de Souza

Page 2: Estrutura de dados em Java - Pilhas

Pilhas

É uma das estruturas de dados mais simples

A idéia fundamental da pilha é que todo o acesso a seus elementos é feito através do seu topo.

Assim, quando um elemento novo é introduzido na pilha, passa a ser o elemento do topo, e o único elemento que pode ser removido da pilha é o do topo.

Page 3: Estrutura de dados em Java - Pilhas

Pilhas:: Aplicações

Verificação de parênteses.

Retirada de vagões de um trem.

Retirada de mercadorias em um caminhão de entregas.

Page 4: Estrutura de dados em Java - Pilhas

Pilhas Os elementos da pilha são retirados na

ordem inversa à ordem em que foram introduzidos: o primeiro que sai é o último que entrou (LIFO – last in, first out).

Existem duas operações básicas que devem ser implementadas numa estrutura de pilha: ◦ operação para empilhar (push) um novo

elemento, inserindo-o no topo, ◦ operação para desempilhar (pop) um elemento,

removendo-o do topo

Page 5: Estrutura de dados em Java - Pilhas

Pilhas:: Push

topo

push(a)

k

m

x

a

push(b)

b

Page 6: Estrutura de dados em Java - Pilhas

Pilhas:: Push

topo

k

m

x

topo

k

m

x

a

topo

k

m

x

a

b

push(a) push(b)

Page 7: Estrutura de dados em Java - Pilhas

Pilhas:: Pop

topo

pop(b)

k

m

x

a

pop(a)

b

Page 8: Estrutura de dados em Java - Pilhas

Pilhas:: Pop

k

m

x

topo

topo

k

m

x

topo

k

m

x

aa

b

pop(b) pop(a)

Page 9: Estrutura de dados em Java - Pilhas

Pilhas:: Implementação de pilha com vetor Supondo a pilha está armazenada em um

vetor pilha[0..n-1]. A parte do vetor ocupada pela pilha será:

0 t n-1

pilha[0..n-1]

Page 10: Estrutura de dados em Java - Pilhas

Pilhas:: Implementação de pilha com vetor

public class Pilha {

static final int MAX = 50;

int n;//Elementos adicionados float vet[] = new float[MAX];

} Pilha;

public class Pilha {

static final int MAX = 50;

int n;//Elementos adicionados float vet[] = new float[MAX];

} Pilha;

Page 11: Estrutura de dados em Java - Pilhas

Prof. Adriano Teixeira de Souza

Pilhas:: Cria estrutura de pilha

Pilha cria(){

Pilha p;p = new Pilha();p.n = 0;/*Inicializa com zero elementos*/return p;

}

Pilha cria(){

Pilha p;p = new Pilha();p.n = 0;/*Inicializa com zero elementos*/return p;

}

Page 12: Estrutura de dados em Java - Pilhas

Pilhas:: Inserir o elemento do topo - push()

void push(Pilha p, float v){ if(p.n == Pilha.MAX){ System.out.println("Capacidade da pilha

estourou."); System.exit(1); /*aborta programa*/ } /* insere elemento na próxima posição livre */ p.vet[p.n] = v; p.n++;}

void push(Pilha p, float v){ if(p.n == Pilha.MAX){ System.out.println("Capacidade da pilha

estourou."); System.exit(1); /*aborta programa*/ } /* insere elemento na próxima posição livre */ p.vet[p.n] = v; p.n++;}

Page 13: Estrutura de dados em Java - Pilhas

Pilhas:: Remover o elemento do topo - pop()

float pop(Pilha p){ float v; if (vazia(p)) { System.out.println("Pilha vazia."); System.exit(1); /*aborta programa*/ } /*retira elemento do topo*/ v = p.vet[p.n-1]; p.n--; return v;}

float pop(Pilha p){ float v; if (vazia(p)) { System.out.println("Pilha vazia."); System.exit(1); /*aborta programa*/ } /*retira elemento do topo*/ v = p.vet[p.n-1]; p.n--; return v;}

Page 14: Estrutura de dados em Java - Pilhas

Pilhas:: Verificar se a pilha está vazia

boolean vazia(Pilha p){ return (p.n == 0);}

boolean vazia(Pilha p){ return (p.n == 0);}

Page 15: Estrutura de dados em Java - Pilhas

Prof. Adriano Teixeira de Souza

Pilhas:: Imprime estrutura de pilha

void imprime (Pilha p) {

int i; for (i=p.n-1; i>=0; i--) System.out.println(p.vet[i]);

}

void imprime (Pilha p) {

int i; for (i=p.n-1; i>=0; i--) System.out.println(p.vet[i]);

}

Page 16: Estrutura de dados em Java - Pilhas

Prof. Adriano Teixeira de Souza

Pilhas:: Testepublic static void main(String[] args) { ManipuladorPilha maninula = new ManipuladorPilha();

Pilha p = maninula.cria(); maninula.push(p,20.0f); maninula.push(p,20.8f); maninula.push(p,20.3f); maninula.push(p,44.5f); maninula.push(p,33.3f); maninula.push(p,20.9f); maninula.imprime (p); System.out.println("Retirado: "+ maninula.pop(p)); System.out.println("Retirado: "+maninula.pop(p)); System.out.println("Configuracao da fila:"); maninula.imprime (p); p = null; }

public static void main(String[] args) { ManipuladorPilha maninula = new ManipuladorPilha();

Pilha p = maninula.cria(); maninula.push(p,20.0f); maninula.push(p,20.8f); maninula.push(p,20.3f); maninula.push(p,44.5f); maninula.push(p,33.3f); maninula.push(p,20.9f); maninula.imprime (p); System.out.println("Retirado: "+ maninula.pop(p)); System.out.println("Retirado: "+maninula.pop(p)); System.out.println("Configuracao da fila:"); maninula.imprime (p); p = null; }

Page 17: Estrutura de dados em Java - Pilhas

Implementação de pilha com lista

Quando o número máximo de elementos que serão armazenados na pilha não é conhecido, devemos implementar a pilha usando uma estrutura de dados dinâmica, no caso, empregando uma lista encadeada.

Os elementos são armazenados na lista e a pilha pode ser representada simplesmente por um ponteiro para o primeiro nó da lista.

Page 18: Estrutura de dados em Java - Pilhas

Pilhas:: Implementação de pilha com lista

public class No {

float info; No anterior;}

public class Pilha { No topo;}

public class No {

float info; No anterior;}

public class Pilha { No topo;}

Page 19: Estrutura de dados em Java - Pilhas

Pilhas:: Operações básicas

Criar uma estrutura de pilha; Inserir um elemento no topo (push); Remover o elemento do topo (pop); Verificar se a pilha está vazia; Liberar a estrutura de pilha

Page 20: Estrutura de dados em Java - Pilhas

Pilhas:: Criar uma estrutura de pilha

Pilha cria(){ Pilha p = new Pilha(); p.topo = null; return p;}

Pilha cria(){ Pilha p = new Pilha(); p.topo = null; return p;}

Page 21: Estrutura de dados em Java - Pilhas

Pilhas:: Inserir o elemento do topo - push()

void push(Pilha p, float v){ No aux = new No(); aux.info = v; aux.anterior = p.topo; p.topo = aux;}

void push(Pilha p, float v){ No aux = new No(); aux.info = v; aux.anterior = p.topo; p.topo = aux;}

Page 22: Estrutura de dados em Java - Pilhas

Pilhas:: Remover o elemento do topo - pop()

float pop(Pilha p){ float v; if (vazia(p)) { System.out.println("Pilha vazia."); System.exit(1); /*aborta o programa*/ } v = p.topo.info; No aux = p.topo; p.topo = aux.anterior; return v;}

float pop(Pilha p){ float v; if (vazia(p)) { System.out.println("Pilha vazia."); System.exit(1); /*aborta o programa*/ } v = p.topo.info; No aux = p.topo; p.topo = aux.anterior; return v;}

Page 23: Estrutura de dados em Java - Pilhas

Pilhas:: Verificar se a pilha está vazia

boolean vazia(Pilha p){ return (p.topo == null);}

boolean vazia(Pilha p){ return (p.topo == null);}

Page 24: Estrutura de dados em Java - Pilhas

Prof. Adriano Teixeira de Souza

Pilhas:: Imprime estrutura de pilha

void imprime (Pilha p) {

for (No q=p.topo; q!=null; q=q.anterior) System.out.println(q.info);

}

void imprime (Pilha p) {

for (No q=p.topo; q!=null; q=q.anterior) System.out.println(q.info);

}

Page 25: Estrutura de dados em Java - Pilhas

Prof. Adriano Teixeira de Souza

Pilhas:: Teste

public static void main(String[] args) { ManipulaPilha manipula = new ManipulaPilha(); Pilha p = manipula.cria(); manipula.push(p,20.0f); manipula.push(p,20.8f); manipula.push(p,20.3f); manipula.push(p,44.5f); manipula.push(p,33.3f); manipula.push(p,20.9f); manipula.imprime (p); System.out.println("Retirado: "+ manipula.pop(p)); System.out.println("Retirado: "+ manipula.pop(p)); System.out.println("Configuracao da fila:\n"); manipula.imprime (p); p = null;}

public static void main(String[] args) { ManipulaPilha manipula = new ManipulaPilha(); Pilha p = manipula.cria(); manipula.push(p,20.0f); manipula.push(p,20.8f); manipula.push(p,20.3f); manipula.push(p,44.5f); manipula.push(p,33.3f); manipula.push(p,20.9f); manipula.imprime (p); System.out.println("Retirado: "+ manipula.pop(p)); System.out.println("Retirado: "+ manipula.pop(p)); System.out.println("Configuracao da fila:\n"); manipula.imprime (p); p = null;}

Page 26: Estrutura de dados em Java - Pilhas

Prof. Adriano Teixeira de Souza

Utilizando o algoritmo anteriormente apresentado implemente um programa que insira dados em uma pilha A e em seguida remova-os elementos da pilha A e insira-os na pilha B com sua ordem invertida.

Exercício