Listas Duplamente Encadeadas! quando for preciso seguir a seqüência de elementos em ambos os sentidos! cada nó possui dois ponteiros: ant e prox ant prox a b c d Início Fim 1
Listas Duplamente Encadeadas - Operações! um conjunto maior de ligações a serem atualizadas! necessário especificar mais um ponteiro ant no algoritmo?! Especificar o algoritmo de! inserção! remoção 2
Listas Circulares! tanto para simplesmente quanto duplamente encadeadas! útil quando! quando se busca a partir de qualquer elemento! não há ordenação na lista! um ponteiro para algum elemento deve estar sempre definido 3
Estruturas de Acesso Restrito! Para muitas aplicações é necessário impor restrições de acesso aos dados! essas restrições podem vir a ser benéficas por:! aliviar a necessidade de usar estruturas com mais detalhes! permitem implementações mais simples e flexíveis, desde que menos operações são suportadas! pilhas - LIFO: last in first out! filas - FIFO: first in first out 4
Pilhas! Apenas duas operácões básicas estão envolvidas:! PUSH ou Empilha: Acrescentar no topo da pilha! POP ou Desempilha: Retirar do topo da pilha 3o. elem. 2o. elem. 1o. elem. 4o. elem. 3o. elem. 2o. elem. 1o. elem. 3o. elem. 2o. elem. 1o. elem.
Pilhas! A política de inserção e remoção à maneira de uma pilha é também conheciada como LIFO: Last In, First Out 6
Pilhas em Lista Sequenciais! PILHA - lista sequencial que implementa pilha! o elemento 0 será definido como o fundo da pilha! topo da pilha: TOPO é o índice que indica a 1a. posição livre da pilha P! pilha vazia: TOPO = 0! restrição: tamanho máximo 4 4o. elem. 3o. elem. 2o. elem. 1o. elem. 7
Pilhas - Lista Sequenciais iniciapilha(){ Topo = 0 /* Pilha vazia */ } ( x ) empilha if(topo < MAX) { /* Possui espaço */ PILHA[topo] = x; Topo ++; return(true); } else return(false); /* estouro da pilha */ 8
Pilhas - Lista Sequenciais #define VAZIA 9999999 desempilha (){ if(topo!= 0) { /* Possui elemento na pilha */ Topo - -; return(pilha[topo]); } else return(vazia); /* pilha vazia */ } 9
Pilhas - Lista Sequenciais " consultar o tamanho atual da pilha altura (PILHA) { return (Topo-1); } " consultar o topo da pilha topo (PILHA) { return(pilha[topo-1]); } 10
Complexidade das Operações em Pilha em Lista Sequenciais ( O(1! Todas as operações são! Se for necessário tratar overflow com realocação, inserção pode ter complexidade de ( O(n pior caso! Uma nova lista de comprimento maior seria alocada! Todos os elementos são copiados para a nova lista 11
Pilhas em lista encadeada! Topo agora é um ponteiro para o topo da pilha! Pilha vazia: Topo= NULL! não possui restrição de tamanho máximo 12
Pilhas - lista encadeada! empilha! desempilha novo elemento 13
Pilhas - lista encadeada () inic_pilha { Topo = NULL; } ( valor ) empilha {?? } 14
Pilhas - lista encadeada () desempilha { t = Topo; if (t == NULL) /* pilha vazia */ ( vazia return( else { } } 15
Pilhas - exercício! um algoritmo que converta uma expressão aritmética da forma parentizada para pós-fixa! Forma parentizada: (* 5 (( 9+8 ) * ( 6*4 ) +) 7 (! Forma pós-fixa: 5 9 8 + 4 6 * * 7 + * 16
Filas! Seja F uma fila, e v um valor:! enfila (v): v é inserido no final da fila F! desenfila(): descarta o elemento mais antigo da fila F, ou seja, o elemento que está no início de F! comprimento(f): retorna o número de elementos na fila F! A política de inserção e remoção de dados à maneira de uma fila é conhecida como FIFO First In First Out 17
Filas " enfila: respeitar o tamanho máximo da lista " desenfila: pode esvaziar a fila 1o. elem. 2o. elem. 3o. elem. 4o. elem. 5o. elem. 6o. elem. 18 1o. elem. 2o. elem. 3o. elem. 4o. elem. 5o. elem. 6o. elem.
Filas 1o. elem. enfila 3o enfila 4o desenfila 2o. elem. 3o. elem. 4o. elem. 5o. elem. 6o. elem. desenfila enfila 5o 1o. elem. 2o. elem. 3o. elem. 4o. elem. 5o. elem. 6o. elem. 19
Filas 1o. elem. 2o. elem. 3o. elem. 4o. elem. 5o. elem. 6o. elem. enfila 6o 20
Filas ( enfila(v { if (mod(fim+1, MAX)!= Início ){ F[Fim]=v; Fim = mod(fim+1, MAX); }else overflow ; } desenfila(){ if( Início!= -1){ valor=f[início]; Início=mod(Início +1,MAX); ( Fim if (Inicio == Inicio = Fim = -1; } else underflow ; } 21
Filas lista encadeada
Filas lista encadeada Inicialização : " inicio = NULL; fim = NULL;! Após a inserção do 1o. elemento 23
Filas lista encadeada inserção enfila_enc (v){ } 24
Filas lista encadeada desenfila_enc(){ } 25
Filas e Pilhas Múltiplas! Alocar mais de um pilha ou fila em uma mesma região de memória! implementação por listas sequenciais! Duas pilhas! simples : uma cresce de cada lado da lista! Mais de duas pilhas! dividir a área em tamanhos proporcionais aos tamanhos máximos das pilhas ou, se não souber, em pedaços iguais. 26
Filas E Pilhas Múltiplas Área de Memória 27
Filas E Pilhas Múltiplas! Especificar os algoritmos de inserção e remoção em pilha, considerando duas pilhas armazenadas em lista sequencial que compartilham a memória de dimensão M 28