aed2

Post on 04-Nov-2015

214 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

Algoritmos e estruturas de dadosProf. Luis Antunes FCUL

TRANSCRIPT

  • Pilhas

    Fac. Cincias Univ. Lisboa Luis Antunes

    Algoritmos e Estruturas de Dados 2010-2011

  • Hoje

    ! Interfaces Java ! Declarao ! utilizao.

    ! Classes que implementam interfaces.

    ! As operaes de uma pilha ! aplicaes das pilhas

    ! Implementaes da pilha.

    Fac. Cincias Univ. Lisboa

    Luis Antunes Algoritmos e Estruturas de Dados 2010-2011

  • Tipos de dados abstractos

    ! Um programa pode usar mtodos para manipular os dados sem estar preocupado com os detalhes da representao dos dados e implementao dos mtodos.

    ! Cada classe pode ser usada como um bloco para construo de novos programas

    ! TDA = dados + mtodos de manipulao

    Fac. Cincias Univ. Lisboa

    Luis Antunes Algoritmos e Estruturas de Dados 2010-2011

  • Interfaces em Java

    ! Os objectos definem a sua interaco com o mundo exterior atravs dos mtodos que expem. O conjunto desses mtodos a interface. ! Ex: botes de controle de um aparelho de televiso

    ! Em Java a interface uma forma de especificar (mas no implementar um TDA). Para cada mtodo, a interface especifica: ! Nomes ! Parmetros ! Valores de retorno

    ! A interface no define: ! Como os mtodos executam as operaes ! Como os dados so representados internamente

    Fac. Cincias Univ. Lisboa

    Luis Antunes Algoritmos e Estruturas de Dados 2010-2011

  • Interfaces em Java

    ! Na sua forma mais simples, a interface um grupo de mtodos relacionados com corpo vazio

    ! As descries dos mtodos chamam-se declaraes de mtodos

    ! Uma interface mais abstracta do que uma classe, e no pode ser instanciada

    Fac. Cincias Univ. Lisboa

    Luis Antunes Algoritmos e Estruturas de Dados 2010-2011

  • Implementao das interfaces

    ! As classes que implementam as interfaces declaram os campos de dados e codificam os corpos dos mtodos

    ! Pode existir mais do que uma forma de implementar os mtodos, logo, mais do que uma classe que implemente a interface. A interface descreve um conjunto de classes

    ! A implementao pode declarar campos de dados e definir mtodos adicionais. A implementao pode definir construtores, mas a interface no, pois na pode ser instanciada

    Fac. Cincias Univ. Lisboa

    Luis Antunes Algoritmos e Estruturas de Dados 2010-2011

  • Exemplo: Bycicle

    interface Bicycle { "void changeCadence(int newValue); " " " "//wheel revolutions per minute "void changeGear(int newValue); "void speedUp(int increment); "void applyBrakes(int decrement);

    } class ACMEBicycle implements Bicycle {

    "// remainder of this class implemented as before "public changeCadence {...}

    }"

    "Fac. Cincias

    Univ. Lisboa Luis Antunes

    Algoritmos e Estruturas de Dados 2010-2011

  • Variveis do tipo interface

    Bicycle aMinhaBicicleta = new Bicycle();"

    // d ERRO, visto que a interface no pode ser instanciada Bicycle aMinhaBicicleta = new ACMEBicycle(); // OK"

    "

    Fac. Cincias Univ. Lisboa

    Luis Antunes Algoritmos e Estruturas de Dados 2010-2011

  • Interface como contrato

    ! Interface = contrato entre a classe (fornecedora) e o mundo exterior (cliente), especificando o comportamento prometido.

    ! Este contrato garantido pelo compilador: todos os mtodos da interface tm que estar implementados para que a classe seja compilada.

    ! Isto permite que o cliente (programador) escreva os seus programas sem ter que se coordenar com o programador que est a implementar a classe.

    ! Reciprocamente, quem implementa a classe pode faz-lo independentemente da aplicao que a usar.

    Fac. Cincias Univ. Lisboa

    Luis Antunes Algoritmos e Estruturas de Dados 2010-2011

  • Pr- e Ps-condies

    ! O contrato pode ser garantido formalmente (JML) com comentrios Javadoc que asseguram pr- e ps- condies de cada mtodo.

    ! Pr-condio: definio de assumpes ou restries aos parmetros de entrada antes do comeo da execuo do mtodo

    ! Ps-condio: descrio do resultado de executar um mtodo

    Fac. Cincias Univ. Lisboa

    Luis Antunes Algoritmos e Estruturas de Dados 2010-2011

  • Tipo de Dados: Pilha

    Fac. Cincias Univ. Lisboa Luis Antunes

    Algoritmos e Estruturas de Dados 2010-2011

  • Pilha (Stack)

    ! Uma pilha uma estrutura que armazena dados segundo o mtodo LIFO, o ltimo a chegar o primeiro a sair (Last In First Out)

    ! Como exemplos desta estrutura temos o empilhar de caixotes, a opo desfazer dos editores de texto, o boto voltar dos browsers

    Fac. Cincias Univ. Lisboa

    Luis Antunes Algoritmos e Estruturas de Dados 2010-2011

  • Especificao da Pilha

    ! StackInt"! boolean empty() // devolve true se a pilha est vazia, false

    no caso contrrio

    ! E peek() // devolve o objecto no topo da pilha sem o remover ! E pop() // devolve o objecto no topo da pilha e remove-o ! E push(E obj) // empilha um item no topo da pilha e devolve o

    item empilhado

    Fac. Cincias Univ. Lisboa

    Luis Antunes Algoritmos e Estruturas de Dados 2010-2011

  • Interface da Pilha

    Fac. Cincias Univ. Lisboa

    Luis Antunes Algoritmos e Estruturas de Dados 2010-2011

  • Interface da Pilha /** Um StackInt uma estrutura de dados LIFO, ou seja, onde os obectos de tipo E so inseridos e removidos pela mesma ponta."

    */ public interface StackInt{

    "/** empilha um item no topo " * @param obj o objecto a empilha " * @return o objecto empilhado " */ "E push (E obj); ""/** devolve o objecto no topo da pilha sem o remover " * @return o objecto no topo da pilha " * @throws EmptyStackException se a pilha est vazia " */ "E peek();"

    Fac. Cincias Univ. Lisboa

    Luis Antunes Algoritmos e Estruturas de Dados 2010-2011

  • Interface da Pilha

    ... "/** devolve o objecto no topo da pilha e remove-o " * post: a pilha tem menos um elemento " * @return o objecto no topo da pilha " * @throws EmptyStackException se a pilha

    est vazia " */ "E pop();

    "/** devolve true se a pilha est vazia, false c.c." * @return true se a pilha est vazia " */ "boolean empty();

    "

    Fac. Cincias Univ. Lisboa

    Luis Antunes Algoritmos e Estruturas de Dados 2010-2011

  • Aplicaes da Pilha

    ! Descobrir palndromas: ! Invertermos a string de input assim:

    ! Para cada caracter da string de input empilhamo-lo ! Deempilhamos para outra string

    ! Comparamos as duas strings, se forem iguais temos palndroma

    !

    Fac. Cincias Univ. Lisboa

    Luis Antunes Algoritmos e Estruturas de Dados 2010-2011

  • PalindromeFinder

    Fac. Cincias Univ. Lisboa

    Luis Antunes Algoritmos e Estruturas de Dados 2010-2011

  • PalindromeFinder (cont.)

    Fac. Cincias Univ. Lisboa

    Luis Antunes Algoritmos e Estruturas de Dados 2010-2011

  • PalindromeFinder: comentrios

    ! Usamos Character em vez de char, porque char um tipo primitivo (queremos um objecto).

    ! Esta no a forma mais eficiente de inverter uma string

    Fac. Cincias Univ. Lisboa

    Luis Antunes Algoritmos e Estruturas de Dados 2010-2011

  • Outra aplicao: ([{ ])}

    ! Se temos s (), basta contar +1 para cada ( e -1 para cada )

    ! Mas com [{( diferente: ! (w * [x + y] / z [p / {r q}]) ! equilibrada, mas ! (w * [x + y) / z [p / {r q}]) ! no equilibrada. Nem mesmo ! (w * [x + y) / z [p / {r q}]]

    Fac. Cincias Univ. Lisboa

    Luis Antunes Algoritmos e Estruturas de Dados 2010-2011

  • Algoritmo isBalanced: ! Criar uma pilha vazia de caracteres

    ! Assumir que a expresso equilibrada (equilibrada = true)

    ! Seja index 0

    ! Enquanto equilibrada true e index < lentgth ! Tomar o prximo catacter na string ! Se um parntesis aberto empilh-lo ! C.c.

    ! se um parntesis fechado desempilha o topo ! Se a pilha est vazia ou o topo no igual ao parntesis

    ! Equilibrado = false ! Aumentar index

    ! Retornar true se equilibrado true e a pilha est vazia Fac. Cincias

    Univ. Lisboa Luis Antunes

    Algoritmos e Estruturas de Dados 2010-2011

  • ParenChecker (simplificado)

    Fac. Cincias Univ. Lisboa

    Luis Antunes Algoritmos e Estruturas de Dados 2010-2011

  • ParenChecker (simplificado)

    Fac. Cincias Univ. Lisboa

    Luis Antunes Algoritmos e Estruturas de Dados 2010-2011

  • ParenChecker (simplificado)

    Fac. Cincias Univ. Lisboa

    Luis Antunes Algoritmos e Estruturas de Dados 2010-2011

  • Implementaes da Pilha

    ! Base da Pilha: theData: ! Extenso da classe Vector ! Lista de Componentes (ArrayList ou LinkedList) ! Array ! Lista ligada

    Fac. Cincias Univ. Lisboa

    Luis Antunes Algoritmos e Estruturas de Dados 2010-2011

  • Impl. com extenso de Vector

    Fac. Cincias Univ. Lisboa

    Luis Antunes Algoritmos e Estruturas de Dados 2010-2011

  • Implementao com Vector

    public class Stack extends Vector { // Vector implementa um array extensvel de // objectos "

    public E push (E obj){ "add(obj); "return obj;

    }"

    Fac. Cincias Univ. Lisboa

    Luis Antunes Algoritmos e Estruturas de Dados 2010-2011

  • Implementao com Vector

    ! public E pop() throws EmptyStackException { "try { " "return remove(size() 1); "} catch (ArrayIndexOutOfBoundsException ex){ " "throw new EmptyStackException(); "}

    }"

    ! problema: como esta implementao diz que o Stack um Vector, podem ser aplicadas todas as operaes legtimas do Vector. Muitas delas violam os princpios do Stack.

    Fac. Cincias Univ. Lisboa

    Luis Antunes Algoritmos e Estruturas de Dados 2010-2011

  • Implementao com Lista

    ! Alternativa: usar uma classe que tenha uma componente List. Todas estas classes implementam a interface List: ArrayList, Vector, LinkedList. Chamamos a esta componente theData, ela vai conter os dados do Stack.

    //push public E push(E obj){

    "theData.add(obj); "return obj;

    } "

    Fac. Cincias Univ. Lisboa

    Luis Antunes Algoritmos e Estruturas de Dados 2010-2011

  • Classe ListStack

    public class ListStack implements StackInt{ "/** A lista que contem os dados */ "private List theData;"

    "/**construtor*/ "public ListStack(){ "theData = new ArryList(); //podia ser outro List "}

    "public E peek(){ " "if (emptyy()) { " " "throw new EmptyStackException(); " "} " "return theData.get(theData.size() 1); "}

    //etc."

  • Impl. com um array

    Fac. Cincias Univ. Lisboa

    Luis Antunes Algoritmos e Estruturas de Dados 2010-2011

  • Impl. com um array

    public class ArrayStack implements StackInt{ "/** os dados */ "E[] theData; "int topOfStack = -1; //inicialmente vazio "private static final int INITIAL_CAPACITY = 10;""/**construtor*/ "public ArrayStack(){ " "theData = (E[]) new Object[INITIAL_CAPACITY];"}

    "public E push(E obj){ " "if (topOfStack == theData.length 1) " " "reallocate(); " "topOfStack++; " "theData[topOfStack] = obj; " "return obj; "}"

  • Impl. com um array (cont.)

    public E pop(){ "if (empty()) { " "throw new EmptyStackException(); "} "return theData[topOfStack--];

    } private void reallocate() {

    "E[] newData = " "(E[])new Object[theData.length+DELTA];

    for(int i=0;i

  • Impl. com lista ligada

    Fac. Cincias Univ. Lisboa

    Luis Antunes Algoritmos e Estruturas de Dados 2010-2011

  • Impl. com um LinkedList public class LinkedStack implements StackInt{

    "// AQUI INSERIR A CLASSE private Node

    "/** os dados */ "private Node topOfStackRef = null;

    "//push "public E push(E obj){ " "topOfStackRef = new Node(obj, topOfStackRef); " "return obj; "}

    "//pop "public E pop(){ " "if (empty()) throw new EmptyStackException(); " "else { " " "E result = topOfStackRef.data; " " "topOfStackRef = topofStackRef.next; " " "return result; " "} "}"

top related