prof ulisses vasconcelos estrutura de dados aula 02 - pilha conceito inserção remoção
TRANSCRIPT
Prof Ulisses Vasconcelos
ESTRUTURA DE DADOSAULA 02 - PILHA
ConceitoInserçãoRemoção
Prof Ulisses Vasconcelos
AULA 02 - PILHA Conceito Inserção Remoção
Prof Ulisses Vasconcelos
CONCEITO Pilhas: São estruturas de dados dinâmicas
que possui duas regiões conhecidas como topo e base (ou fundo).
Inserção (LIFO): Os itens sempre são inseridos no topo da pilha
Remoção(LIFO): Os itens sempre são retirados do topo da pilha
Estrutura dinâmica: Comprimento variável O único elemento que se tem acesso é o
elemento que está no topo A base é o primeiro elemento que foi
inserido na pilha O topo é o ultimo elemento que foi inserido
na pilha
Prof Ulisses Vasconcelos
CONCEITO Funcionamento de pilha
utilizando vetores:
-120554
1289
01234
24
5
Pilhacheia
Pilhavazia
• Vetores possuem um espaço
limitado para armazenamento de dados.
• Necessitamos definir um espaço grande o suficiente para a nossa pilha.
• Necessitamos de um indicador (sentinela) de qual elemento do vetor é o atual topo da pilha.
Prof Ulisses Vasconcelos
CONCEITO Funcionamento de pilha
utilizando vetores:Declaração da pilhaconst max = 50; var
pilha : recordtopo : Byte;dados = ARRAY [1..max] OF
Integer end;
Prof Ulisses Vasconcelos
CONCEITO Operações
Colocar (PUSH) itens na pilha Retirar (POP) itens da pilha Obtêm o elemento do topo (TOP) da pilha Verificar se a pilha está cheia Verificar se a pilha está vazia Iniciar ou limpar a pilha
Erros possíveis Estouro de pilha (overflow): Tentar inserir
em pilha cheia Underflow tentar acessar/excluir um item
de uma pilha vazia
Prof Ulisses Vasconcelos
CONCEITO Implementação de
funcionalidades de uma pilha: IniciaçãoProcedure Init(var P:pilha);Begin
P.topo:=-1;End;
Prof Ulisses Vasconcelos
CONCEITOS Verifica se a pilha é vaziaFunction IsEmpty(var
P:pilha):boolean;Begin
if P.topo = -1then IsEmpty:=trueelse IsEmpty:=false
End;
Prof Ulisses Vasconcelos
CONCEITOS Verifica se a pilha está cheiaFunction IsFull(var
P:pilha):boolean;Begin
if P.topo=max then IsFull:=true
else IsFull:=false
End;
Prof Ulisses Vasconcelos
Inserção Inserção em pilha de arrayProcedure Push(var P:pilha; x:char);Begin
if not IsFull(P) then begin
P.topo:=P.topo + 1; P.dados[P.topo]:= x
end else writeln(´Pilha Cheia!´)End;
Verificação para evitar overflow
Prof Ulisses Vasconcelos
Exclusão Exclusão em pilha de arrayFunction Pop(var P:pilha):char;Begin
if not IsEmpty(P) then begin
Pop:=P.dados[P.topo]; P.topo:=P.topo - 1;
endelse
writeln(´Pilha Vazia!´)End;
Verificação para evitar underflow
Prof Ulisses Vasconcelos
Pilhas de Ponteiros Criação da pilha usando
ponteirostype
apontador = ^celula;celula = record item:integer; prox:apontador; end;tipopilha=record fundo:apontador; topo:apontador; end;
Prof Ulisses Vasconcelos
Célulacelula = record
item:integer; prox:apontador; end;
Prox
Item
item: Variável que recebe valores inteirosprox: Apontador que aponta para um registro do tipo célulaDeclaração: Var c1 : celula;
Utilizaçãoc1.item := 3;c1.prox :=
Prof Ulisses Vasconcelos
Pilhatipopilha=record
fundo:apontador; topo:apontador; end;
Topo
Fundo
Célula Célula
fundo: Apontador que aponta para um registro do tipo célulatopo: Apontador que aponta para um registro do tipo célula
Ref. 0 Ref. 1
Ref. 0 Ref. 1
Prof Ulisses Vasconcelos
Pilhas de ponteiros Inicia pilhaprocedure iniciapilha(var
pilha:tipopilha);var aux:apontador;begin new (aux); pilha.fundo:=aux; pilha.topo:=pilha.fundo; pilha.topo^.prox :=nil;end;
Prof Ulisses Vasconcelos
procedure iniciapilha(var pilha:tipopilha);var aux:apontador;begin new (aux); pilha.fundo:=aux; pilha.topo:=pilha.fundo; pilha.topo^.prox :=nil;end;
Prox
Item
aux
Topo
Fundo
Ref. 0Ref. 0
Ref. 0 Ref. 0
{Ref. 0
NIL
NIL
Prof Ulisses Vasconcelos
Pilhas de ponteiros Verifica se está vaziafunction
vazia(pilha:tipopilha):boolean;begin vazia:=pilha.fundo = pilha.topo;end;
Prof Ulisses Vasconcelos
Pilhas de ponteiros Inserçãoprocedure inserir(x:integer;var
pilha:tipopilha);var aux:apontador;begin new (aux); pilha.topo^.prox:=aux; aux^.prox := nil; aux^.item :=x; pilha.topo := aux;end;
Prof Ulisses Vasconcelos
procedure inserir(x:integer;var pilha:tipopilha);var aux:apontador;
begin
new (aux); pilha.topo^.prox:=aux; aux^.prox := nil; aux^.item :=x; pilha.topo := aux;end;
Prox
Item
auxRef. 1
Ref. 1
Prox
Item
Topo
Fundo
Ref. 0
Ref. 0 Ref. 0
NILRef. 1
NIL
3
3
3
Ref. 1
Prof Ulisses Vasconcelos
Pilhas de ponteiros Exclusãoprocedure retirai(var x:integer; var pilha:tipopilha);
varaux:apontador;beginaux:= pilha.fundo^.prox;x:=aux^.item;pilha.fundo^.prox := aux^.prox;if(pilha.fundo^.prox = nil ) then
pilha.topo := pilha.fundo;dispose(aux);end;
Prof Ulisses Vasconcelos
procedure retirai(var pilha:tipopilha);
varaux:apontador;beginaux:= pilha.fundo^.prox;pilha.fundo^.prox := aux^.prox;if(pilha.fundo^.prox = nil ) then
pilha.topo := pilha.fundo;dispose(aux);
end;
Prox
Item
Ref. 1
Prox
Item
Topo
Fundo
Ref. 0
Ref. 0
Ref. 1
NIL3
Ref. 1
Valor de aux: Ref. 1
NIL
Ref. 0
Prof Ulisses Vasconcelos
Pilhas de ponteiros Exclusãoprocedure retirar(var x:integer; var pilha:tipopilha);
varaux:apontador;beginif ( pilha.fundo^.prox^.prox = nil ) then retirai(x,pilha)else
begin aux:=pilha.fundo^.prox; while (aux^.prox <>pilha.topo) do aux :=aux^.prox; pilha.topo :=aux; aux:=aux^.prox; x:=aux^.item; pilha.topo^.prox:=nil; dispose(aux); end;
end;
Prof Ulisses Vasconcelos
procedure retirar(var pilha:tipopilha);var aux:apontador; begin if ( pilha.fundo^.prox^.prox = nil ) then
retirai(pilha)else
begin aux:=pilha.fundo^.prox; while (aux^.prox <>pilha.topo) do aux :=aux^.prox; pilha.topo :=aux; aux:=aux^.prox; pilha.topo^.prox:=nil; dispose(aux); end;
end; Ref. 1
Prox
Item
Topo
Fundo
Ref. 0
Ref. 0
Ref. 1
Ref. 23
Ref. 2
Ref. 2
NIL5Valro de aux:Ref. 1
Ref. 1
Valro de aux:Ref. 2
NIL