Você está na página 1de 36

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.

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

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

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

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
Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

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

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

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
Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

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 {...}
}"
"
Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Variveis do tipo interface


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

Bicycle aMinhaBicicleta = new ACMEBicycle(); // OK"


"

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

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.

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Pr- e Ps-condies
! O contrato pode ser garantido formalmente (JML) com

comentrios Javadoc que asseguram pr- e pscondies 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

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

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

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Especificao da Pilha
!

StackInt<E>"
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
!

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Interface
da Pilha

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Interface da Pilha
/** Um StackInt<E> uma estrutura de dados LIFO, ou seja,
onde os obectos de tipo E so inseridos e removidos pela
mesma ponta."
*/
public interface StackInt<E>{
"/** 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();"
Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

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

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

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

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

PalindromeFinder

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

PalindromeFinder (cont.)

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

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

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

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}]]
!

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

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


Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

ParenChecker (simplificado)

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

ParenChecker (simplificado)

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

ParenChecker (simplificado)

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Implementaes da Pilha
! Base da Pilha: theData:
!
Extenso da classe Vector

Lista de Componentes (ArrayList ou LinkedList)


! Array
!
Lista ligada
!

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Impl. com extenso de Vector

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Implementao com Vector


public class Stack<E> extends Vector<E> {
// Vector implementa um array extensvel de
// objectos
"
public E push (E obj){
"add(obj);
"return obj;
}"

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

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.
Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

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;
}
"
Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Classe ListStack
public class ListStack<E> implements StackInt<E>{
"/** A lista que contem os dados */
"private List<E> theData;"
"/**construtor*/
"public ListStack(){
"theData = new ArryList<E>(); //podia ser outro List
"}

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

Impl. com um array

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Impl. com um array


public class ArrayStack<E> implements StackInt<E>{
"/** 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<theData.length;i++)
newData[i] = theData[i];
theData = newData;
}"

Impl. com lista ligada

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Impl. com um LinkedList

public class LinkedStack<E> implements StackInt<E>{


"// AQUI INSERIR A CLASSE private Node<E>

"/** os dados */
"private Node<E> topOfStackRef = null;
"//push
"public E push(E obj){
"
"topOfStackRef = new Node<E>(obj, topOfStackRef);
"
"return obj;
"}
"//pop
"public E pop(){
"
"if (empty()) throw new EmptyStackException();
"
"else {
"
"
"E result = topOfStackRef.data;
"
"
"topOfStackRef = topofStackRef.next;
"
"
"return result;
"
"}
"}"

Você também pode gostar