Estrutura de Dados Pilha (Stack) Estrutura de Dados que corresponde a uma lista sequencial com a propriedade seguinte: LIFO O primeiro elemento a entrar é o último a sair ( Last in First Out ) Operações básicas: criar uma pilha vazia; sobreposição de um novo elemento; retirar o elemento do topo da pilha verificar qual é o elemento no topo da pilha verificar se a pilha está vazia Representação dinâmica: type TipoValor =... ; Pilha = ˆ Elemento; Elemento = record valor : TipoValor; ant : Pilha; MP II, 2006/2007 p.16/??
Operadores sobre Pilha function criar : cria uma pilha vazia Pilha; function vazia(p:pilha) : boolean; devolve verdade sse a pilha P estiver vazia procedure sobrepor(var P : Pilha; x : coloca um novo elemento com x no topo da pilha P TipoValor) procedure remover(var P : Pilha) remove o elemento da cabeça da pilha P; dá erro se vazia function topo(p:pilha) : TipoValor; Se a pilha P não estiver vazia, devolve o valor no elemento do topo de P ; dá erro se vazia MP II, 2006/2007 p.17/??
Estrutura de Dados Fila (Queue) Estrutura de Dados que corresponde a uma lista sequencial com a propriedade seguinte: FIFO O primeiro elemento a entrar é o primeiro a sair ( First in First Out ) Operações básicas: criar uma fila vazia; inserção de um novo elemento no fim; retirar o elemento da frente da fila verificar qual é o elemento na frente da pilha verificar se a fila está vazia Representação dinâmica: type TipoValor =... ; Fila = ˆ Elemento; Elemento = record valor : TipoValor; ant : Fila; MP II, 2006/2007 p.18/??
Operadores sobre Fila function criar : cria uma fila vazia Fila; function vazia(f:fila) : boolean; devolve verdade sse a fila F estiver vazia procedure por(var F : Fila; x : TipoValor) coloca um novo elemento com x no fim da fila F procedure remover(var F : Fila) remove o elemento da cabeça da fila F; dá erro se vazia function frente(p:pilha) : TipoValor; Se a fila F tiver elementos, devolve o valor no elemento da cabeça de F; dá erro se vazia MP II, 2006/2007 p.19/??
Filas e Pilhas como Estruturas Dinâmicas Uma Pilha deve ser implementada como Lista Ligada Simples Uma Fila deve ser implementada como Lista Ligada com Elemento Base MP II, 2006/2007 p.20/??
Pilha (Stack) Estrutura LIFO type TipoValor =... ; Lista = ˆ Elemento; Elemento = record valor : TipoValor; Pilha = Lista; ant : Lista; {* Cria uma pilha vazia *} function criarp : Pilha; criarp := nil {* devolve TRUE sse pilha vazia *} function vaziap(p : Pilha): boolean; if P == nil then vaziap := true else vaziap := false MP II, 2006/2007 p.21/??
Implementação da operações para Pilha {* cria novo elemento Elemento, inicializa e devolve apontador *} function cria_elem(val : TipoValor) : Lista; var aux : Lista; new(aux); with auxˆ do valor := val; prox := nil; cria_elem := aux; {* cria e coloca novo elemento no topo de p = INSERE NA CABECA *}... MP II, 2006/2007 p.22/??
Implementação da operações para Pilha continuação {* remove elemento do topo de P = REMOVE A CABECA *} Procedure remover(var P : Pilha) var aux : Pilha; if not vaziap(p) then aux := P; P := Pˆ.prox ; dispose(aux); end else writeln( **** ERRO: Tentativa de remover de pilha vazia ); MP II, 2006/2007 p.23/??
Continuação da continuação {* devolve o valor do elemento no topo de p *} procedure topo(p Pilha; var val : TipoValor); if not vaziap(p) then val := pˆ.valor; else writeln( **** ERRO: Tentativa de consultar pilha vazia ) val := valor_vazio; end MP II, 2006/2007 p.24/??
FILA (Queue) Estrutura FIFO TipoValor =... ; Lista = ˆ Elemento; Elemento = record valor : TipoValor; ant : Lista; Fila = ˆrecord inicio : Lista; fim : Lista; {* Cria uma fila vazia *} function criarf : Fila; var aux : Fila; new(aux); with auxˆ do inicio := nil; fim := nil; criarf := aux; MP II, 2006/2007 p.25/??
Implementação da operações para FILA {* devolve TRUE sse fila vazia *} function vaziap(f : Fila): boolean; if Fˆ.inicio == nil then vaziaf := true else vaziaf := false {* INSERE NO FIM COM PONTEIRO AUXILIAR *} Procedure por(val : TipoValor; var F : Fila) var novo : Lista; novo := cria_elem(val); if vaziaf(f) then Fˆ.inicio := novo; else Fˆ.fimˆ.prox := novo; Fˆ.fim := novo; MP II, 2006/2007 p.26/??
Implementação da operações para FILA continuação {* remove elemento da frente de F = REMOVE A CABECA *} Procedure remover(var F : Fila) var aux : Lista; if not vaziaf(f) then aux := Fˆ.inicio; F := auxˆ.prox; dispose(aux); if vaziaf(f) then Fˆ.fim := nil; { se este era o ultimo elemento } end else writeln( **** ERRO: Tentativa de remover de fila vazia ); MP II, 2006/2007 p.27/??
Continuação da continuação {* devolve o valor do elemento no topo de p *} procedure topo(f : Fila; var val : TipoValor); if not vaziaf(f) then val := Fˆ.inicioˆ.valor; else writeln( **** ERRO: Tentativa de consultar Fila vazia ); val := valor_vazio; end MP II, 2006/2007 p.28/??