Você está na página 1de 18

Tipos Abstractos de Dados

O que um TAD?
TAD= Conjunto de Objectos + Conjunto de Operaes Abstraces Matemticas

EDA1

Para que serve?


Denir um conjunto de objectos e o modo como se comportam (operaes)
EDA1-16-Setembro-2008

Tipos Abstractos de Dados


Como se usa?
Na prtica requer uma implementao Em si no especica o modo como as operaes so implementadas No existe nenhuma regra que nos diga quais as operaes que suportadas por um TAD, trata-se duma opo de desenho.
EDA1-16-Setembro-2008
2

EDA1

O TAD Stack (pilha)


O que uma pilha?
J vimos e lidamos com muitas: Text Pilha de roupa Pilha de loua Distribuidor de PEZ

EDA1

O TAD Stack (pilha)


Que operaes possveis com uma pilha?
Ver o objecto no topo da pilha Retirar um objecto da pilha (topo) Carregar um objecto na pilha Saber se est vazia

EDA1-16-Setembro-2008

O TAD Stack (pilha)


Dar nomes s operaes:
Ver o primeiro (TOP) Retirar um objecto (POP) Inserir um objecto (PUSH) Saber se est vazia (EMPTY)

EDA1

Saber quantos elementos tem a pilha (SIZE)

Qual o resultado das operaes, para a pilha de PEZ da gura?


size top

Nenhuma destas operaes modica a pilha


5

EDA1-16-Setembro-2008

EDA1

O TAD Stack (pilha)


Adicionar um objecto pilha modica-a:

.push (

) resulta

Agora: top size

9
6

EDA1-16-Setembro-2008

EDA1

O TAD Stack (pilha)


Tambm a operao de retirar um objecto da pilha a modica:
.pop ( ) resulta

Agora: top size

7
7

EDA1-16-Setembro-2008

O TAD Stack (pilha)

EDA1

A criao duma nova pilha deve resultar um objecto deste tipo que no contenha nenhum elemento (que esteja vazia!) Uma operao que informe se a pilha est vazia importante (p.e. empty) As operaes de pop e top devem lanar uma excepo tipo EmptyStackException
EDA1-16-Setembro-2008
8

Uma interface para Stack


public interface Stack<E>{ public void push(E o); public E top() throws EmptyException; public E pop() throws EmptyException; public int size(); public boolean empty(); }

EDA1

EDA1-16-Setembro-2008

Implementao com array


0 1 2 3 4 5 6 dim
e1 e2 e3 e4

EDA1

pop() 3 4 5 6 dim

0
e1

1
e2

2
e3

push(e5) 3
e5

0
e1
EDA1-16-Setembro-2008

1
e2

2
e3

dim

10

Discusso da Implementao
A complexidade das operaes
Mtodo Complexid ade O(1) size O(1) empty O(1) top O(1) pop O(1) push A complexidade espacial O(N), independentemente do nmero de elementos que a stack contenha

EDA1

A desvantagem desta implementao a xao dum limite para o nmero de elementos que a stack comporta
EDA1-16-Setembro-2008

Soluo??

11

Aplicaes das Stacks


A Stack do Java (Java method Stack):

EDA1

Trata-se duma Stack onde so mantidas informaes relativamente s variveis locais (aos mtodos) e outras informaes necessrias. Durante a execuo dum programa a JVM mantm uma stack cujos elementos so descritores dos mtodos invocados e activos, estes descritores so designados por frames.
EDA1-16-Setembro-2008
12

Aplicaes das Stacks Recurso:


public static long fact(long n){ if (n<=1) return 1; else return n*fact(n-1);}

EDA1

calcular fact(5)
n n*fact (1) n 2 ? 2 3 6 ? 4 ? 24 5 120 ?
13

A Stack do Java permite que o mtodo exista em diferentes frames activas. Cada frame armazena o parametro n e o valor a ser retornado. Desde que as sucessivas chamadas evoluam para o caso de base, no h EDA1-16-Setembro-2008 problema.

n*fact (2) fact n n*fact (3) n n*fact (4)

Aplicaes das Stacks

EDA1

Converso inx-postx e avaliao de expresses: A expresso (3+4)*10 diz-se em notao inx, por os operadores(binrios) estarem no meio dos operandos. Este tipo de notao til para ns torna o clculo de expresses complexo, por exigir o uso de parntesis para estabelecer a ordem das operaes. 3 4 + 10 * o equivalente expresso anterior em notao postx

A avaliao duma expresso postx pode fazer-se usando uma stack e com uma s passagem pelo EDA1-16-Setembro-2008 input

14

Avaliao duma expresso EDA1 postx


A avaliao duma expresso postx faz-se lendo a expresso, se lido um nmero pe-se na Stack se lido um operador, realiza-se a operao com os dois operandos retirados da Stack, e adiciona-se na Stack o resultado da operao: exemplo: 6 5 3 2 + 9 * 3 / - *
6*-10=-60 9*5=45 5-15=-10 45/3=15 3+2=5 3 9 2 15 45 5 3 -10 5 6
EDA1-16-Setembro-2008
15

Converso inx-postix

EDA1

A expresso 6 5 3 2 + 9 * 3 / - * a converso para postx da expresso em inx 6*(5-(3+2)*9/3) A converso duma expresso inx para postx faz-se tambm usando uma stack cujo uso est descrito no algoritmo. Assume-se que s existem parnteses curvos e que a expresso est correcta (pelo menos correctamente balanceada de parnteses).
EDA1-16-Setembro-2008

16

EDA1 while ((s=smbolo lido)!=null) if <s numero> then


output+=s; else

if <s == )> while (stack.top()!= ()


output += stack.pop() stack.pop()

else if <prioridade(s) >prioridade(stack.top())>

Do maior para o menor ( * / + -

stack.push(s) else while(stack.top<>( or stack.top()>=prioridade(s)) output+=stack.pop() stack.push(s) EDA1-16-Setembro-2008 while (!stack.empty()) output+=stack.pop()

17

EDA1
input: output: 6 6 * 5 ( 3 5 2 + ( 9 3 * + 3 2 / ) * * 9 / 3 )

+ * ( / ( *

EDA1-16-Setembro-2008

18

Você também pode gostar