Estrutura de Dados - PILHAS

43
Estrutura de Dados (Aula 03)

Transcript of Estrutura de Dados - PILHAS

Page 1: Estrutura de Dados - PILHAS

Estrutura de Dados(Aula 03)

Page 2: Estrutura de Dados - PILHAS

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

Page 3: Estrutura de Dados - PILHAS

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

Page 4: Estrutura de Dados - PILHAS

INSTITUTO FEDERALTRIÂNGULO MINEIRO

Campus Uberlândia Centro

Pilha(Stack)

Page 5: Estrutura de Dados - PILHAS

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

Page 6: Estrutura de Dados - PILHAS

INSTITUTO FEDERALTRIÂNGULO MINEIRO

Campus Uberlândia Centro

Funcionamento de uma pilha

Page 7: Estrutura de Dados - PILHAS

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

Page 8: Estrutura de Dados - PILHAS

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;

Page 9: Estrutura de Dados - PILHAS

INSTITUTO FEDERALTRIÂNGULO MINEIRO

Campus Uberlândia Centro

Elementos de uma pilha

oPilha com vetores

Page 10: Estrutura de Dados - PILHAS

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

Page 11: Estrutura de Dados - PILHAS

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

Page 12: Estrutura de Dados - PILHAS

INSTITUTO FEDERALTRIÂNGULO MINEIRO

Campus Uberlândia Centro

Pilha pronta em JAVA

Page 13: Estrutura de Dados - PILHAS

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

Page 14: Estrutura de Dados - PILHAS

INSTITUTO FEDERALTRIÂNGULO MINEIRO

Campus Uberlândia Centro

Pilha pronta em JAVA

package PilhaJava;

import java.util.EmptyStackException;

import java.util.Stack;

Page 15: Estrutura de Dados - PILHAS

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");

}

Page 16: Estrutura de Dados - PILHAS

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");

}

Page 17: Estrutura de Dados - PILHAS

INSTITUTO FEDERALTRIÂNGULO MINEIRO

Campus Uberlândia Centro

Pilha com vetor

Page 18: Estrutura de Dados - PILHAS

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(){}

Page 19: Estrutura de Dados - PILHAS

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;

}

Page 20: Estrutura de Dados - PILHAS

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);

}

Page 21: Estrutura de Dados - PILHAS

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;

}

Page 22: Estrutura de Dados - PILHAS

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;

}

Page 23: Estrutura de Dados - PILHAS

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();

Page 24: Estrutura de Dados - PILHAS

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");

Page 25: Estrutura de Dados - PILHAS

INSTITUTO FEDERALTRIÂNGULO MINEIRO

Campus Uberlândia Centro

TDA de uma pilha

Representação do nó ou célula

Representação da pilha

topo

Page 26: Estrutura de Dados - PILHAS

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

Page 27: Estrutura de Dados - PILHAS

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

Page 28: Estrutura de Dados - PILHAS

INSTITUTO FEDERALTRIÂNGULO MINEIRO

Campus Uberlândia Centro

Criar uma pilha e verificar pilha vazia

public Pilha(){

tamanho = 0;

topo = null;

}

Page 29: Estrutura de Dados - PILHAS

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;

}

Page 30: Estrutura de Dados - PILHAS

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

Page 31: Estrutura de Dados - PILHAS

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

Page 32: Estrutura de Dados - PILHAS

INSTITUTO FEDERALTRIÂNGULO MINEIRO

Campus Uberlândia Centro

Inserção na pilha (iii)

5. Faz o topo apontar para o elemento que foi inserido

Page 33: Estrutura de Dados - PILHAS

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++;

}

Page 34: Estrutura de Dados - PILHAS

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

Page 35: Estrutura de Dados - PILHAS

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;

}

Page 36: Estrutura de Dados - PILHAS

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");

}

}

Page 37: Estrutura de Dados - PILHAS

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();

}

Page 38: Estrutura de Dados - PILHAS

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;

Page 39: Estrutura de Dados - PILHAS

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);

Page 40: Estrutura de Dados - PILHAS

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

Page 41: Estrutura de Dados - PILHAS

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

Page 42: Estrutura de Dados - PILHAS

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

Page 43: Estrutura de Dados - PILHAS

INSTITUTO FEDERALTRIÂNGULO MINEIRO

Campus Uberlândia Centro

Fim da aula.....

[email protected]