Estrutura de Dados - PILHAS
-
Upload
iftm-instituto-federal-de-educacao-ciencia-e-tecnologia-do-triangulo-mineiro -
Category
Technology
-
view
126 -
download
2
Transcript of Estrutura de Dados - PILHAS
Estrutura de Dados(Aula 03)
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
1. Estrutura de Dados
8.1 Pilha
8.2 Fila
8.3 Lista
8.4 Árvores de pesquisa
http://www.inf.ufsc.br/~ronaldo/ine5384/15-OrdenacaoDados.pdf
Tema da aula
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Introdução
oAté o momento:
o Vetores estáticos;
o Com tamanho definido;
oAcesso sequêncial;
o De agora em diante:
o Estruturas dinâmicas;
o Com tamanho indefinido;
0 1 2 3 4 5
3 8 7 9 0 3
3 8 7 9 0 3
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Pilha(Stack)
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Estrutura de dados de pilha
o É a estrutura de dados mais simples;
o É implementada diretamente pelo hardware das máquinas modernas;
o Idéia fundamental da pilha é que todo o acesso a seus elementos é feito através do seu topo;
o O único elemento que pode ser removido é o topo;
o Com esse fundamento faz com que os elementos da pilha sejam retirados de ordem inversa;
o LIFO – Last In First Out
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Funcionamento de uma pilha
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Exemplo de uma aplicação com uso de pilha
http://www.gameson.com.br/Jogos-Online/ClassicoPuzzle/Torre-de-
Hanoi.html
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Elementos de uma pilha
o criar uma pilha vazia;
o inserir um elemento no topo de uma pilha;
o remover o elemento que está no topo de pilha;
o verificar se a pilha esta vazia;
o verificar o elemento que esta no topo da pilha;
o zerar a pilha;
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Elementos de uma pilha
oPilha com vetores
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
TDA de uma pilha
oEmpilha(elemento) – insere um objeto no topo da pilha
•Entrada = objeto saida = nenhum
oDesempilhar() - retira um objeto do topo de pilha e o retorna,
deverá ter uma proteção pois a pilha não pode estar vazia
•Entrada = nenhum saída = objeto
oTamanho() - retorna o número de objetos dentro de uma pilha
•Entrada = nenhuma saída = inteiro
oVazia() - retorna um booleano indicando se a pilha está vazia
•Entrada = nenhuma saída = booleano
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
TDA de uma pilha
oTopo() - retorna o objeto que está no topo de uma pilha,
deverá ter uma proteção para a pilha vazia;
•Entrada = nenhuma saída = objeto
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Pilha pronta em JAVA
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Pilha pronta em JAVA
o Em Java já temos uma classe para o TDA pilha, portanto
basta importarmos o:
•java.util.Stack
o Os métodos push(obj) e pop() são equivalentes a empilha(o)
e desempilha() respectivamente
o O método peek() é equivalente ao método topo(), tamanho()
e vazia();
o Os métodos pop() e peek() laçam a exceção
StackEmptyException se a pilha estiver vazia
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Pilha pronta em JAVA
package PilhaJava;
import java.util.EmptyStackException;
import java.util.Stack;
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Pilha pronta em JAVA
Try{ // usou try pois a pilha pode estar vazia
Stack pilha = new Stack();
//cria uma pilha como se fosse um objeto genérico
. . .
}
catch(EmptyStackException e){
System.out.println("Pilha vazia");
}
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Pilha pronta em JAVA
try{ // usou try pois a pilha pode estar vazia
. . .
pilha.push(1);
pilha.push(2);
System.out.println(pilha.peek());
pilha.pop();
System.out.println(pilha.peek());
pilha.pop();
System.out.println(pilha.peek());
}
catch(EmptyStackException e){
System.out.println("Pilha vazia");
}
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Pilha com vetor
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Pilha com vetor
package PilhaVetor;
public class PilhaVetor {
public static final int total = 1000;
private int capacidade;
private Object pilha[];
private int topo = -1;
public PilhaVetor(){}
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Pilha com vetor
public PilhaVetor(int tam){
capacidade = tam;
pilha = new Object[capacidade];
}
// retorna a quantidade de elementos da // pilha
public int tamanho(){
return topo + 1;
}
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Pilha com vetor
// empilha um certo elemento no topo da
// pilha
public void empilhar(Object elemento){
if(tamanho() == capacidade)
System.out.println("Pilha Cheia");
else
pilha[++topo] = elemento;
}
// informa se a pilha estah vazia ou nao
public boolean vazia(){
return(topo < 0);
}
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Pilha com vetor
// retira e retorna o elemento que estah
// no topo da pilha
public Object desempilhar(){
Object fora = null;
if(vazia())
System.out.println("Pilha Vazia");
else{
fora = pilha[topo];
pilha[topo] = null;
topo--;
}
return fora;
}
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Pilha com vetor
// retorna o elemento que estah no topo
// de uma pilha
public Object verTopo(){
if(!vazia())
return pilha[topo];
else
return null;
}
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Pilha com vetor
public static void main(String[] args) {
Dados a = new Dados("Ricardo", "Rua x", 34);
Dados b = new Dados("Maria", "Rua y", 60);
Dados c = new Dados("Joao", "Rua v", 19);
PilhaVetor pilha = new PilhaVetor(3);
pilha.empilhar(a);
pilha.empilhar(b);
pilha.empilhar(c);
Dados res = (Dados) pilha.verTopo();
System.out.println(res.getNome() + " - "
+ res.getEndereco() + " - "
+ res.getIdade());
pilha.desempilhar();
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Pilha com vetor
res = (Dados) pilha.verTopo();
System.out.println(res.getNome() + " - "
+ res.getEndereco() + " - "
+ res.getIdade());
pilha.desempilhar();
res = (Dados) pilha.verTopo();
if (res != null)
System.out.println(res.getNome() + " - "
+ res.getEndereco() + " - "
+ res.getIdade());
else
System.out.println("Pilha vazia");
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
TDA de uma pilha
Representação do nó ou célula
Representação da pilha
topo
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
TDA de uma pilha
public class No<T> {
private T valor;
private No<T> proximo;
public No(T valor, No<T> proximo) {
this.valor = valor;
this.proximo = proximo;
}
public No(){}
....
// alem disso temos os
// métodos de getters e
// setters
}
Representação do nó ou célula
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
TDA de uma pilha
ublic class Pilha<T> {
protected No<T> topo;
protected int tamanho;
public Pilha(){
tamanho = 0;
topo = null;
}
....
} Representação da pilha
topo
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Criar uma pilha e verificar pilha vazia
public Pilha(){
tamanho = 0;
topo = null;
}
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Criar uma pilha e verificar pilha vazia
public boolean vazia(){
return topo == null;
}
public int tamanho(){
return tamanho;
}
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Inserção na pilha (i)
1. Pré-requisito: pilha tem que estar criada e o próximo apontando
para NULL;
2. Criar um nó ou célula;
3. Atribuir o elemento ao campo info;
4. O próximo do nó criado será ligado ao para quem o topo esta apontando
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Inserção na pilha (ii)
5. Faz o topo apontar para o elemento que foi inserido
Próximo passo:
6. O próximo do nó criado será ligado ao para quem o topo esta apontando
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Inserção na pilha (iii)
5. Faz o topo apontar para o elemento que foi inserido
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Inserção na pilha (iii)
5. Faz o topo apontar para o elemento que foi inserido
void empilhar (T elemento){
No<T> aux = new No(null, null);
aux.setValor(elemento);
aux.setProximo(topo);
topo = aux;
tamanho++;
}
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Remoção da pilha (i)
1. Pré-condição é que tenha elementos na pilha.
2. Auxiliar recebe o topo da pilha
3. O topo aponta para o próximo do auxiliar
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Remoção da pilha (i)
T desempilhar (){
No<T> aux = null;
T elemento = null;
if (vazia()) {
System.out.println("Pilha vazia\n");
}
else {
aux = topo;
elemento = topo.getValor();
topo = aux.getProximo();
tamanho--;
}
return elemento;
}
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Ver topo da pilha (i)
1. Pré-requisito é ter elementos na pilha.
2. Um nó auxiliar recebe o topo e depois apresenta o que tem como info;
void verTopo(){
No<T> aux = null;
if (!vazia()) {
aux = topo;
System.out.println("Topo: " + aux.getValor());
}
else{
System.out.println("Pilha vazia\n");
}
}
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Zerar pilha
public static void main(String[] args){
Pilha<Integer> p = new Pilha();
p.empilhar(1);
p.verTopo();
p.empilhar(2);
p.verTopo();
Integer res = p.desempilhar();
System.out.println("Retirado: " + res.toString());
p.verTopo();
res = p.desempilhar();
System.out.println("Retirado: " + res.toString());
p.verTopo();
}
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Exercícios
• Dado o TDA abaixo criar uma pilha para armazenar dos dados;
Contatos:
nome;
Endereco:
rua;
bairro;
cep;
numero;
Telefone:
fixo;
celular;
trabalho;
email;
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Exercícios
• Método principal
printf(“Menu”);
printf(“\n1.Empilhar”);
printf(“\n2.Desempilhar”);
printf(“\n3.Ver Topo”);
printf(“\n4.Zerar”);
printf(“\n5.Sair”);
printf(“\nDigite a opcao: ”);
scanf(“%d”, &opcao);
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Praticar
• Considerando uma Pilha vazia, quais são os comandos necessários para a inserção do 1o nó ?
• Considerando uma Pilha não vazia, quais são os comandos necessários para a exclusão de um nó ?
• Considerando uma Pilha não vazia, quais são os comandos necessários para a inserção de um novo nó ?
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Praticar implementação
• Escreve um programa que utilizando uma pilha determina se uma string é um palíndromo ou não, isto é, se pode ser lida da mesma maneira para frente ou para trás.
• Implemente uma APLICAÇÃO que utilize uma pilha para conversão de expressões da notação tradicional (infixa), completamente parentizadas, para a e notação polonesa reversa (pós-fixada).
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Praticar implementação
Implemente uma APLICAÇÃO que utilize uma pilha para conversão de expressões da notação tradicional (infixa), completamente parentizadas, para a e notação polonesa reversa (pré-fixada).
INSTITUTO FEDERALTRIÂNGULO MINEIRO
Campus Uberlândia Centro
Fim da aula.....