Anda di halaman 1dari 50

Curso de Cincia da Computao

Universidade Federal do Ma

Estrutura de Dados Prof. Anselmo C. de Paiva Depto de Informtica

Pilhas e Filas

Operaes sobre Colees


Inserir um elemento Remover um elemento Buscar por um elemento Enumerar um elemento Operaes complexas
Unio/interseo/diferena de colees Nem sempre necessrias para todas as aplicaes
Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

Pilhas e Filas

Exemplos de limitaes de acesso:


Insero acontece somente em posies conhecida Listagem dos elementos deve obedecer ordem especfica Busca pode acontecer simplesmente em uma posio especfica FIFO ( first in first out) e LIFO (last in first out)
Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

Pilhas e Filas

Estrutura de Dados - Pilha


Coleo onde as operaes afetam somente o elemento mais recente Disciplina de acesso FIFO
Primeiro que entra o primeiro que sai

Pilhas e Filas

Operaes Bsicas:
Criar Insero push Remoo pop

Operaes Adicionais:
Primeiro EstaVazia Destruir
Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

Pilhas e Filas

Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

Pilha - Especificao Formal


/* Construir uma nova pilha Pre-condio: (max_itens > 0) && (item_size > 0) Pos-condio: retorna um ponteiro para uma pilha vazia */ /* Retira o elemento do topo da pilha Pre-condio: (s foi criada por stkCria) && (cabe um elemento na pilha) && (item != NULL) Pos-condio: item foi adicionado ao topo da pilha s */

Pilhas e Filas

/* Retira o elemento no topo da pilha Pre-condio: (s foi criada por stkCria) && (existe pelo menos um item na pilha) Pos-condio: elemento do topo da pilha foi removido */
Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

Pilha - Implementao em Vetor


Elementos so armazenados em um vetor S. O final da pilha fica na posio 0 - S[0]. A varivel top armazena o nmero de elementos na pilha Push armazena um item em S[top],e incrementa top Pop decrementa top e retorna S[top]
Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

Pilhas e Filas

Pilha - Funcionamento em um vetor


Pilha inicial
A F L

Pilhas e Filas

Top=3 Aps push(R) push(G)


A F L R G

Top=5

Aps

pop

Top=4
Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

Pilhas e Filas

Exemplo

Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

Pilha - Implementao stack.h


typedef struct _stack_ *Stack;

Pilhas e Filas

Stack stkCria ( int max_itens); Int stkPush( Stack s, void *item ); void *stkPop( Stack s ); void *stkPrimeiro( Stack s ); int stkEstaVazia( Stack s ); int stkDestruir (Stack s); Implementar as funes
Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

10

Aplicaes de Pilha

Pilhas e Filas

Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

11

Pilhas e Filas

Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

12

Pilhas e Filas
Verificao de Parenteses

Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

13

Pilhas e Filas

Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

14

Pilhas e Filas

Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

15

Problema das N-Rainhas


colocar 8 rainhas em um tabuleiro de xadrez dispostas de modo que duas rainhas no se ataquem. Algoritmo para encontrar uma maneira de colocar N Rainhas num tabuleiro N x N.
usa uma pilha para guardar onde cada rainha colocada. (numrainha, I, J) Guarda quantas linhas foram preenchidas at o momento (L). Para cada nova rainha
Coloca a posio da nova rainha na pilha Enquanto h conflito muda para a prxima coluna direita. Quando no h mais conflitos, L++

Pilhas e Filas

Se no for possvel colocar uma rainha, aps vrios deslocamentos


posicionamento atual das demais rainhas est impedindo Fazer backtracking (retrocesso) para a ltima rainha colocada
Tentar coloca-la numa nova posio

continuar o restante do processo a partir dessa nova posio.

Este raciocnio seguidamente repetido at que encontremos uma configurao sem ataques.
Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

16

Preenchimento de Regies

Pilhas e Filas

Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

17

Preenchimento de Regies

Pilhas e Filas

Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

18

Preenchimento de Regies

Pilhas e Filas

Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

19

Notao Infixa, Posfixa, Prefixa


Referente posio do operador em relao aos

Pilhas e Filas

Converso de notao
Infixa para posfixa

operandos A+B +AB AB+ add (A, B)

Operaes com maior precedncia convertidas antes Desnecessrio uso de parnteses

Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

Exponenciao ^ Multiplicao & Diviso * / Adio &Subtrao + 20

Pilhas e Filas

Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

21

Avaliando uma expresso posfixa


Se for operando, empilha.

Pilhas e Filas

se operador, desempilha os 2

operandos da pilha, aplica o operador e empilha o resultado para os prximos operadores.

Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

22

Pilhas e Filas
Ex.: 6 2 3 + - 3 8 2 / + * 2 ^ 3 +

Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

23

Pilhas e Filas

Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

24

Pilhas e Filas
Converso de infixa para posfixa

Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

25

Pilhas e Filas

Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

26

Pilhas e Filas

Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

27

Pilhas e Filas

Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

28

Pilhas e Filas

Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

29

Pilhas e Filas

Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

30

Pilhas e Filas

Exemplo

Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

31

Recursividade
Tcnica muito til
Usada na definio de vrias funes matemticas
Ex:
fatorial Fibonacci Maior denominador comum de Euclides

Pilhas e Filas

Definio de estruturas de dados


estruturas recursivas so naturalmente processadas por funes recursivas

Resoluo de problemas como Jogos


Torres de Hanoi (simples) Xadrez (complexos)
resolvendo o programa recursivamente, a estrutura recursiva registra os passos executados para chegar na soluo Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

32

Recurso - Exemplo
Nmeros de Fibonacci fib( n ) = if ( n = 0 ) then 1 Mtodo de Clculo else if ( n = 1 ) then 1
Implementao em C else fib(n-1) + fib(n-2)
int fib( n ) { if ( n < 2 ) return 1; else return fib(n-1) + fib(n-2); }

Pilhas e Filas

Soluo simples e elegante, mas ineficiente, No entanto, em muitos outros casos ( e.g. busca binria) soluo eficiente tambm
Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

33

Aspectos da Recursividade
Todo processo recursivo:
Caso base: resolvido sem recursividade; Mtodo geral que reduz um caso particular a um ou mais casos base.

Pilhas e Filas

Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

34

Recursividade Torres de Hanoi


Problema:
Considere 3 torres ( 1, 2 e 3) e 64 discos com dimetros decrescentes colocados na torre 1; Mover os 64 discos para a torre 3 (usando 2 como suporte), com a restrio que um disco maior no pode ficar sobre um menor; Mover (64, 1, 3, 2)
Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

Pilhas e Filas

35

Pilhas e Filas

Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

36

Recursividade Torres de Hanoi


void move ( int n, int de, int para, int temp) { if ( n>0) { move ( n-1, de, temp, para) printf(Move %d discos de %d para %d, n, de, para) move ( n-1, temp, para, de) }
Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

Pilhas e Filas

37

Pilhas e Filas

Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

38

Pilhas e Filas
Coleo em que a insero feita numa extremidade e a eliminao na outra. (LIFO: last in, first out).
( a1, a2 , ..., an) eliminaes no incio inseres no final

Fila

Operaes associadas:
Criar (F) - criar uma fila F vazia Inserir (x, F) - insere x no fim de F (enqueue) Vazia (F) - testa se F est vazia Primeiro (F) - acessa o elemento do incio da fila Elimina (F) - elimina o elemento do incio da fila (dequeue)
39

Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

Pilhas e Filas Fila - Implementao em um Vetor


Elementos so armazenados em um vetor Q. A varivel front guarda o ndice do primeiro item da fila. A varivel rear guarda o ndice do prximo elemento a ser inserido na fila. Inserir armazena o elemento em Q[rear], e incrementa rear. Elimina incrementa front.
Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

40

Pilhas e Filas Fila - Exemplo em um vetor


Fila inicial
L
Front=2

F
Rear=5

Insere(R)

L
Front=2

R
Rear=6

Insere(G) Insere(k)

K Rear=1

L Front=2

Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

41

Pilhas e Filas Fila - Implementao em Vetor


Typedef struct _queue_ { int front, rear; int maxItens; void **qArray; }Queue; /* Inserir (x, F) - insere x no fim de q */ int Enqueue (Queue *q, void *b) { if (IsFull(q)) { return FALSE; }else { q->qArray[q->rear] = b; q->rear++; return TRUE; } } /* Vazia (q) - testa se q est vazia */ int IsEmpty (Queue *q) { if ( q->front == q->rear) { return TRUE; } else{ return FALSE; } }

/* Criar (q) - criar uma fila q vazia */ Queue *Create(int max) { Queue *q = (Queue *)malloc( sizeof(Queue)); if ( q == NULL ) return NULL; q->qArray = (void **) calloc(max, sizeof(void *)); if(q->qArray== NULL)return NULL; q->front = 0; q->rear = 0; q->maxItens = max; return q; }
Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

42

Pilhas e Filas Fila - Implementao em Vetor


/* ** Primeiro (q) ** acessa o elemento do incio da fila */ void *First (Queue *q ) { void *b; if( IsEmpty(q) ) { return NULL: } else { b = q->front; q->front++; return b; } }
Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

/* ** Elimina (F) ** elimina o elemento do incio da fila */ int Dequeue (Queue *q) { if (IsEmpty(q)) { return FALSE; } else { q->front++; return TRUE; } } int IsFull( Queue *q) { if ( q->rear <q->maxItens -1 ) { return TRUE; } else { return FALSE; }
}
43

Aplicao: Conteno de recursos

Pilhas e Filas

Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

44

Escalonamento de Processos

Pilhas e Filas

Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

45

Pilhas e Filas

Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

46

Fila - Problemas de Implementao


Considere a seguinte sequncia de operaes sobre um fila QDQDQDQDQD. (Q - queue e D - dequeue), a fila ter sempre 1 ou 0 elementos, no entanto num certo instante apenas um elemento na fila, que ocupa a ltima posio A fila est vazia, mas no cabe mais nenhum item Opo: na eliminao(Dequeue) aps o incremento de front,
verificar se fila vazia
if (IsEmpty(q) ) { q->front =-1; q->rear = 0; }

Pilhas e Filas

Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

47

Fila - Problemas de Implementao


O que aconteceria se a sequncia fosse QQDQDQDQDQ... A lista estaria com no mximo dois elementos, mas no haveria espao para inserir mais ningum, mesmo com vrias posies livres no vetor. Alternativa:
Forar rear a usar o espao liberado por front (Fila Circular)
Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

Pilhas e Filas

Fila em vetor circular (Kruse, R.L. and Ryba, A. J. Data Structures and Program Design in C++, Prentice Hall, 1999)

48

Fila Implem. de Fila Circular


Vetor com m elementos: ndices de 0 a m-1
ndices indicando as extremidades da fila: front e rear ( front = rear = 0 qdo rear = m-1, prximo elemento inserido na posio 0 (se vazia) Condio de fila vazia front igual a rear Algoritmos:
int Enqueue (Queue *q, void *b) { int Dequeue (Queue *q) { if (IsFull(q)) { if (IsEmpty(q)) { return FALSE; return FALSE; }else { } else { if(q->rear = = (q->maxItens-1) { q->front = (q->front +1 )% q->qArray[q->rear] = b; q->maxItens; q->rear = 0; return TRUE; }else { } q->rear = q->rear +1; } } return TRUE; Maneiras diferentes de fazer a mesma coisa: } } ao chegar ao final do vetor retornar pra posio zero
Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados

Pilhas e Filas

49

Fila - Implem. de Fila Circular


Como definir fila cheia e fila vazia ????
Adiciona contador de nmero de elementos na fila
Os algoritmos de verificao de fila cheia e fila vazia ficam:

Pilhas e Filas

int IsFull( Queue *q) { Typedef struct _queue_ { if ( q->numItens <q->maxItens ) int front, { rear; return FALSE; } else { int numItens; return TRUE; int maxItens; } void **qArray; } }Queue; int IsEmpty (Queue *q) Ao inserir e retirar algum item da fila { incrementa ou decrementa o nmero if ( q->numItens == 0) { return TRUE; de itens na fila( numItens), que foi } else{ inicializado com zero. return FALSE; } Prof. Anselmo C. de Paiva - DEINF-UFMA - Estrutura de Dados 50 }

Anda mungkin juga menyukai