aed2
Post on 04-Nov-2015
214 Views
Preview:
DESCRIPTION
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