estruturas de dados elementares - INPE

Propaganda
CAP-241–ComputaçãoAplicadaI
Aula5–EstruturasdeDadosElementares
ParteI–Arranjos,Listas,PilhaseFilas
Dr.GilbertoRibeirodeQueiroz
SãoJosédosCampos,14deAbrilde2016
VisãoGeraldaAula
•  EstruturasdedadosElementares:
– 
– 
– 
– 
– 
Listas.
Pilhas.
Filas.
Árvores.
FilasdePrioridade
•  ContainersdaBibliotecaSTL
•  ConsideraçõesFinais.
•  LeiturasComplementares.
•  Exercícios.
EstruturasdeDados
•  AssimcomonamatemáWca,conjuntospossuemumpapel
importantenaCiênciadaComputação:
–  Adiferençabásica,équeosconjuntomanipuladosporalgoritmos
podemcresceroudiminuircomotempo,ouatémesmomodificaros
valoresdeitens.
–  Conjuntosemcomputaçãopossuemumanaturezadinâmica.
•  Oprojetodealgoritmos,quasesempre,dependedealgumWpode
representaçãoparaoconjuntodedados,sejaeledeentradaou
saída,ouatémesmoumconjuntomanWdodeformatemporária
duranteoprocessamentodoalgoritmo.
•  Alémdisso,cadaalgoritmopossuiseusrequisitosnahorade
manipularconjuntos.
EstruturasdeDados
•  Exemplo:Umfamosoalgoritmoparacomputaçãodos
pontosdeintersecçãoentreconjuntosdesegmentos
dereta,precisadeumconjuntoauxiliarpara:
ü Inserireventos,querepresentampontosextremosdos
segmentosoupontosdeintersecçãojádetectados;
ü Obteroeventocommenorvalordeabscissa(ou
ordenada);
ü Removereventosjáprocessados;
ü Verificarseumdadoeventojáseencontranoconjunto.
EstruturasdeDados
•  Umadastécnicasfundamentaisparaconstruçãodebons
algoritmosconsisteemorganizaroconjuntodedadosmanipulados
deformaqueasoperaçõessobreessesdadossejamrealizadasde
formaeficiente.
•  AsestruturasdedadossãoabstraçõesuWlizadasparaorganizaros
dadosdeformaapropiciarumusoeficienteporpartedos
algoritmos.
•  Estruturasdedadosmaiselementaresparaorganizaçãodosdados
queiremosvernocurso:
–  arranjos,listas,pilhas,filaseárvores.
–  EstasestruturasrepresentamosexemplosclássicosdeWposabstratos
dedados(TAD).
TerminologiaBásica
•  Oselementosdeumconjuntoserãorepresentadosporobjetos,que
podemconterdiversosatributos.
•  Emalgumassituações,assumiremosqueumdessesatributospossuium
papelespecial:
–  iden<ficaroobjeto⇒chave(key).
–  Achave,emgeral,irápertenceraumconjuntototalmenteordenado:
•  númerosreais
•  strings(ordemlexicográfica).
•  Essanoçãodeordemtotaléimportantepoisnospermitedefiniromenor
emaiorelementosdeumconjunto,opróximoelementomaiorqueum
dadoelementodoconjunto.
•  Osobjetospodemcontertambémalgunsatributosespeciais,uWlizados
exclusivamentepelasestruturasdedados.
Arranjos
(arrays)
Um arranjo representa uma quanWdade fixa
deelementosdedadosquesãoarmazenados
de forma conBgua na memória e são
acessíveisatravésdeíndices.
Vetores:sãoarranjosunidimensionais.
Matrizes:sãoarranjosbidimensionais.
ArranjosemLinguagensdeProgramação
•  ArranjosEstáWcos:
–  SuportadosporWposprimiWvosdalinguagemdeprogramação.
–  EsteWpodearranjopossuiumtamanhofixoemtempodecompilação,ouseja,
precisamos“adivinhar”otamanhodoarranjoqueprecisaremosusaremtempode
compilação.
–  EmCeC++,temosacondiçãodecriarvetoresematrizesmulWdimensionaiscomessas
caracterísWcas.
0 1 2
intprimos[3]={2,3,5};
doublevalores[2][3]={
{8,5,3},
{1,7,6}
};
primos 235
0 1 2
valores
0 853
1 176
ArranjosemLinguagensdeProgramação
•  ArranjosDinâmicos:
–  EsteWpodearranjopossuiumtamanhofixo,masquepodeserdefinidoemtempode
execução.
–  Suportadoscomousodefunçõesouoperadoresdalinguagemcapazesdealocarblocos
dememóriaemtempodeexecução:
• 
• 
EmCtemosafamíliadefunções:malloc,calloc,reallocefree.
EmC++,temososoperadoresnew,new[],deleteedelete[].
–  Algumaslinguagensoferecemestruturaspararepresentaçãodematrizesdinâmicas,isto
é,umamatrizcujaasdimensõespodemserespecificadasemtempodeexecução.
Jáestudamoscomofuncionaaalocação
dinâmicadememóriaemC.
ArranjosemLinguagensdeProgramação
•  ArranjosDinâmicos:
–  EsteWpodearranjopossuiumtamanhofixo,masquepodeserdefinidoemtempode
execução.
–  Suportadoscomousodefunçõesouoperadoresdalinguagemcapazesdealocarblocos
dememóriaemtempodeexecução:
• 
• 
EmCtemosafamíliadefunções:malloc,calloc,reallocefree.
EmC++,temososoperadoresnew,new[],deleteedelete[].
–  Algumaslinguagensoferecemestruturaspararepresentaçãodematrizesdinâmicas,isto
é,umamatrizcujaasdimensõespodemserespecificadasemtempodeexecução.
Comofuncionaaalocaçãodinâmicade
memóriaemC++?
PropriedadesdosArranjos
•  Umvetorpossuiumaorganizaçãosequencialimplícita,isto
é,atravésdaposiçãoquecadaelementoocupa.
•  Oi-ésimoelementodeumvetorV,podeseracessado
atravésdaseguintenotação:V[i].
•  Agrandeimportânciadaestruturadedadosarranjoéque
elatemumacorrespondênciacomamemóriado
computador:
–  ocódigodemáquinageradoporumcompiladoraparWrdeum
programaemlinguagemdealtonívelparaacessoaositensé
eficiente.
–  comentarexercícioE-5.1.
Listas
(Lists)
Listas
•  Umalistapodeserusadaparaorganizarum
conjuntodeelementossequencialmente.
Itemdedado
elemento
L
I
ligações
S
T
A
FormasdoEncadeamento
•  Encadeamentosimples:
L
I
S
T
A
cauda
cabeça
•  Encadeamentoduplo:
L
cabeça
I
S
T
A
cauda
TADLista:OperaçõesUsuais
•  UmTADlistapodeserdefinidoatravésdas
seguintesoperações:
ü search(L,k):procuraoprimeiroelemento
comchaveknalistaL.
ü insert(L,x):insereoelementoxnoinícioda
listaL.
ü erase(L,x):removeoelementoxdalistaLe
apagaoitemx.
TADLista:OperaçõesUsuais
•  Outrasoperaçõespossíveis:
ü splice(L1,L2):emendaoselementosdalista
L2aofinaldalistaL1.
ü split(L,x):partealistaLemduaslistas,uma
terminandonoelementoxeoutracomeçandono
elementox.
ü merge(L1,L2):juntaduaslistasordenadasem
umasó,tambémordenada.
TADLista:OperaçõesUsuais
•  Outrasoperaçõespossíveis:
ü pred(L,x):retornaoelementodaListaLque
precedeoelementox.
ü succ(L,x):retornaoelementodaListaLque
sucedeoelementox.
ListaxVetor
Qualadiferençaentreumalistaeum
vetor?
VantagensxDesvantagens
Quaissãoasvantagense
desvantagensdesteWpode
representação?
ListaEncadeadaSimples(slist)
L
cabeça
I
S
T
A
cauda
ListaEncadeadaSimples(slist)
•  Implementaçãopormeiodeponteiros.
L
cabeça
I
S
T
A
cauda
•  Quaisseriamasoperaçõesusuaissobreeste
Wpodelista?
ListaEncadeadaSimples(slist)
•  Operações:
slist():construtordelistavazia.
~slist():odestrutordalistairáapagartodosos
seuselementos.
push_front(v):insereovalorvnoiníciodalista.
front():acessaoprimeiroelementodalista.
ListaEncadeadaSimples(slist)
•  Operações:
insert_after(pos,v):insereovalorvnalista,
apósoelementoqueocupaaposiçãopos.
erase_after(pos):removeoelementoapóso
elementoqueocupaaposiçãopos.
find(v):retornaoelementoquecontémovalor
informado,ounulocasonãoexistaumelemento.
ListaEncadeadaSimples(slist)
•  Operações:
clear():apagatodososelementosdalista.
empty():retornaverdadeirosealistaesWvervazia,
casocontrário,retornafalso.
Obs.: Para não nos complicarmos
com os templates por hora, vamos
implementar uma lista encadeada
simplescomnúmerosinteiros.
Atenção:UmaversãouWlizandotemplatespodeserencontradanositedocurso:
hlp://www.dpi.inpe.br/~gribeiro/doku.php?id=wiki:cursos:cap241-2016:aula5estruturas_dados
TADslist:representaçãointerna
•  Cadaelementodalistaserárepresentadopela
seguinteestrutura:
structitem
{
intdata;
item*next;
};
data
next
9
ponteirop/próximo
itemdalista
TADslist:representaçãointerna
•  Porsuavez,alistaserárepresentadaporuma
classecomumúnicomembrodedados
privado:
classslist
{
...
private:
item*head_;
};
3
7
2
head_:ponteiropara
acabeçadalista.
TADslist:definição
classslist
{
Estruturaaninhada
public:
structitem
{
intdata;
item*next;
};
...
};
TADslist:definição
classslist
{
public:
...
slist();
~slist();
...
};
Construtor
Destrutor
TADslist:definição
classslist
{
public:
...
voidpush_front(intv);
item*front()const;
...
};
TADslist:definição
classslist
{
public:
...
item*insert_after(item*pos,intv);
voiderase_after(item*pos);
item*find(intvalue)const;
...
};
TADslist:definição
classslist
{
public:
...
voidclear();
boolempty()const;
...
};
TADslist:definição
Tornandoestesdoisoperadoresprivados,sem
classslist
fornecerumaimplementação,farácomqueos
{
objetosslistnãopossamsercopiáveis
...
private:
slist(slist&);
slist&operator=(slist&);
private:
C++éumalinguagemondeoidiomadecópiaé
item*head_; algonatural,noentanto,demandaextrema
atençãodoprojeWstadeumaclasse.Vocêsabe
};
comofuncionaessesistemadecópia?
UsandooTADslist
slistl;//criaumalistavazia
l.push_front(2); 2
l.push_front(7); 7
2
l.push_front(3); 3
7
2
l.push_front(5); 5
3
7
l.push_front(9); 9
5
3
2
7
2
UsandooTADslist
slist::item*x=l.find(7);
head_
9
5
3
7
x
if(x)
l.erase_after(x);
head_
9
5
3
7
x
2
UsandooTADslist
x=l.find(5);
head_
9
5
3
7
x
if(x)
x=l.insert_after(x,8);
9
5
8
3
7
head_
x
TADslist:implementação
•  slist():construtordelistavazia.
slist::slist()
:head_(nullptr)
{
}
head_
0x0000000000000000
64-bits
TADslist:implementação
•  ~slist():odestrutordalistairáapagartodosos
seuselementos.
slist::~slist()
{
clear();
}
head_
9
5
8
head_
3
7
TADslist:implementação
•  push_front(intv):insereumelementono
iníciodalista.
voidslist::push_front(intv)
{
head_=newitem{v,head_};
}
Listalcontendo1elemento
head_
l.push_front(7);
newitem{v,head_};
7
2
2
novoelemento
head_
7
2
head_=newitem{v,head_};
TADslist:implementação
•  front():acessaoprimeiroelementodalista.
slist::item*slist::front()const
{
returnhead_;
}
head_
7
2
TADslist:implementação
•  insert_after(pos,v):insereumelementonalistalogo
apósoutroelemento.
slist::item*
slist::insert_after(item*pos,intv)
{
assert(pos);
item*nn=newitem{v,pos->next};
pos->next=nn;
returnnn;
}
TADslist:implementação
•  erase_after(item*pos):removeumelementoapóso
elementoinformado.
voidslist::erase_after(item*pos)
{
assert(pos&&pos->next);
item*dn=pos->next;
pos->next=dn->next;
deletedn;
}
TADslist:implementação
•  find(v):retornaoelementoquecontémovalorinformado,
ounulocasonãoexistaumelemento.
slist::item*slist::find(intv)const
{
item*i=head_;
x=l.find(5);
while(i)
head_
9
5
{
if(i->data==v)
i
break;
head_
9
5
i=i->next;
}
i
returni;
}
3
7
3
7
TADslist:implementação
•  clear():apagatodososelementosdalista.
voidslist::clear()
{
while(item*i=head_)
{
head_=head_->next;
deletei;
}
}
l.clear();
head_
5
3
7
TADslist:implementação
i
•  clear():apagatodososelementosdalista.
5
voidslist::clear()
{
while(item*i=head_)
{
head_=head_->next;
deletei;
}
}
i
3
7
head_
3
i
7
head_
3
i
7
head_
5
i
3
head_
7
TADslist:implementação
•  empty():dizsealistaencontra-seounãovazia.
boolslist::empty()const
{
returnhead_==nullptr;
}
Qualoespaçodearmazenamentoda
nossaestruturaslistparaumalista
contendonelementos?
sizeof(T)=kesizeof(T*)=v
f(n)=n*(k+v)+v
supondok==v,f(n)=k(2n+1)
O(n)
Qualacomplexidadeda
operaçãopush_front(v)?
O(1)
Qualacomplexidadeda
operaçãofront(v)?
O(1)
Qualacomplexidadedaoperação
insert_after(pos,v)?
O(1)
Qualacomplexidadeda
operaçãoerase_after(pos)?
O(1)
Qualacomplexidadeda
operaçãofind(v)?
O(n)
Qualseriaacomplexidadedeuma
operaçãocount()queretornasse
onúmerodeelementosdalista?
QuaisestratégiapoderíamosuWlizar
paraimplementarestaoperação?
SemanWvéssemosumponteiroextrapara
acaudadalista,quaisoutrasoperações
poderíamoster?Qualocustodelas?
push_back?,back?,pop_back?
Umalistaencadeadasimplesnos
permiterealizardeformaeficienteuma
travessiasequencialunidirecional.
Quandoprecisamosdeumaestrutura
dinâmicaquepossibiliteatravessia
bidirecional,uWlizamoslistas
duplamenteencadeadas.
ListaDuplamenteEncadeada(list)
L
cabeça
I
S
T
A
cauda
ListaDuplamenteEncadeada(list)
•  Implementaçãopormeiodeponteiros.
L
cabeça
I
S
T
A
cauda
•  Quaisseriamasoperaçõesusuaissobreeste
Wpodelista?
ListaDuplamenteEncadeada(list)
•  Operações:
list():construtordelistavazia.
~list():odestrutordalistairáapagartodososseus
elementos.
push_front(v):insereovalorvnoiníciodalista.
front():acessaoprimeiroelementodalista.
ListaDuplamenteEncadeada(list)
•  Operações:
next(x):retornaopróximoelementodalista.
previous(x):retornaoelementoanteriorao
elementoxnalista.
insert(pos,v):insereovalorvnalista,antesdo
elementoqueocupaaposiçãopos.
erase(x):removeoelementox.
ListaDuplamenteEncadeada(list)
•  Operações:
find(v):retornaoelementoquecontémovalor
informado,ounulocasonãoexistaumelemento.
clear():apagatodososelementosdalista.
empty():retornaverdadeirosealistaesWvervazia,
casocontrário,retornafalso.
Obs.: Para não nos complicarmos
com os templates por hora, vamos
implementar uma lista duplamente
encadeadaparanúmerosinteiros.
Atenção:UmaversãouWlizandotemplatespodeserencontradanositedocurso:
hlp://www.dpi.inpe.br/~gribeiro/doku.php?id=wiki:cursos:cap241-2016:aula5estruturas_dados
TADlist:representaçãointerna
•  Cadaelementodalistaserárepresentadopela
seguinteestrutura:
structitem
{
item*next;
item*prev;
intdata;
};
ponteirop/oitem
anterior
data
9
ponteirop/próximo
itemdalista
TADlist:representaçãointerna
•  Porsuavez,alistaserárepresentadaporuma
classecomumúnicomembrodedados
privado:
classlist
{
...
private:
item*head_;
};
3
7
2
head_:ponteiropara
acabeçadalista.
TADlist:definição
classlist
{
Estruturaaninhada
public:
structitem
{
item*next;
item*prev;
intdata;
};
...
};
TADlist:definição
classlist
{
public:
...
list();
~list();
...
};
Construtor
Destrutor
TADlist:definição
classlist
{
public:
...
item*next(item*x)const;
item*previous(item*x)const;
...
};
TADlist:definição
classlist
{
public:
...
voidpush_front(intv);
item*front()const;
...
};
TADlist:definição
classlist
{
public:
...
item*insert(item*pos,intv);
voiderase(item*x);
item*find(intvalue)const;
...
};
TADlist:definição
classlist
{
public:
...
voidclear();
boolempty()const;
...
};
TADlist:definição
Tornandoestesdoisoperadoresprivados,sem
classlist
fornecerumaimplementação,farácomqueos
{
objetoslistnãopossamsercopiáveis
...
private:
list(list&);
list&operator=(list&);
private:
item*head_;
};
UsandooTADlist
listl;//criaumalistavazia
l.push_front(2);
l.push_front(7);
l.push_front(3);
l.push_front(5);
l.push_front(9);
UsandooTADlist
list::item*x=l.find(7);
if(x)
l.erase(x);
UsandooTADlist
x=l.find(5);
if(x)
x=l.insert(x,8);
TADlist:implementação
•  list():construtordelistavazia.
list::list()
:head_(nullptr)
{
}
TADlist:implementação
•  ~list():odestrutordalistairáapagartodosos
seuselementos.
list::~list()
{
clear();
}
TADlist:implementação
•  next(item*x):retornaoelementoseguinteaoelemento
xnalista.
list::item*list::next(item*x)const
{
returnx->next;
}
TADlist:implementação
•  previous(item*x):retornaoelementoanteriorao
elementoxnalista.
list::item*list::previous(item*x)const
{
returnx->prev;
}
TADlist:implementação
•  push_front(intv):insereumelementono
iníciodalista.
voidlist::push_front(intv)
{
item*nn=newitem{head_,nullptr,v};
if(head_)
head_->prev=nn;
head_=nn;
}
TADlist:implementação
•  front():acessaoprimeiroelementodalista.
list::item*list::front()const
{
returnhead_;
}
TADlist:implementação
•  insert(item*pos,intv):insereumelementonalista
antesdeoutroelemento.
list::item*list::insert(item*pos,intv)
{
assert(pos);
item*nn=newitem{pos,pos->prev,v};
pos->prev=nn;
if(nn->prev)
nn->prev->next=nn;
else
head_=nn;
returnnn;
}
TADlist:implementação
•  erase(item*x):removeoelementoinformado.
Voidlist::erase(item*x)
{
assert(x);
if(x->prev)
x->prev->next=x->next;
else
head_=x->next;
if(x->next)
x->next->prev=x->prev;
deletex;
}
TADlist:implementação
•  find(v):retornaoelementoquecontémovalorinformado,
ounulocasonãoexistaumelemento.
list::item*list::find(intv)const
{
item*i=head_;
while(i)
{
if(i->data==v)
break;
i=i->next;
}
returni;
}
TADlist:implementação
•  clear():apagatodososelementosdalista.
Voidlist::clear()
{
while(item*i=head_)
{
head_=head_->next;
deletei;
}
}
TADlist:implementação
•  empty():dizsealistaencontra-seounãovazia.
boollist::empty()const
{
returnhead_==nullptr;
}
Qualoespaçodearmazenamentoda
nossaestruturalistparaumalista
comnelementos?
sizeof(T)=kesizeof(T*)=v
f(n)=n*(k+2v)+v
supondok==v,f(n)=k(3n+1)
O(n)
Listas:ConsideraçõesFinais
OrdemdosElementos
•  Seoselementosdalistaencontram-se
ordenados,aordemlineardalista
correspondeàordemdachavedoelemento
dedados:
–  Omenorelementocorrespondeaoelementoda
cabeçadalista.
–  Omaiorelementocorrespondeaoelementoda
cauda.
TravessiaBidirecional
•  Acrescentandoumponteiroparaacaudada
lista(tail_),numalistaduplamente
encadeadas,poderíamos:
–  realizarumatravessiaporqualquerumadas
extremidadesdalista
–  Acrescentaroperaçõesparainserçãoeremoção
aofinaldalista.
ListasCirculares
•  ListasEncadeadaSimples:
–  Podemosadotaraconvençãodequealigação(ponteiro)
doúlWmonóaponteparaoprimeironódalista
head_
9
5
3
7
2
•  ListasDuplamenteEncadeadas:
–  AligaçãoparaopróximonódoúlWmoelementoaponta
paraoprimeiro;ealigaçãodoelementoanteriornocaso
doprimeiroelementoapontaparaoúlWmo.
head_
9
5
3
7
2
tail_
OutrasEstratégiasdeImplementação
•  ElementoSenWnela:
–  PodemosuWlizaralgunsobjetosespeciais,
conhecidoscomodummyousen.nelas,para
facilitaraimplementaçãodaslistas.
–  Nestecasocriamosumelementoextraquepode
simplificaraescritadasoperações.
–  DevemosuWlizaresterecursocombastante
cuidadopoisemumaaplicaçãocomumgrande
númerodepequenaslistasesseespaçoextra
podepenalizarosistema.
OutrasEstratégiasdeImplementação
•  Implementaçãodelistaspormeiodearranjos:
–  Implementaçãopormeiodevetoresparalelos.
Implementação:vetoresparalelos
items next
0
1
2
3
4
5
6
7
head
0
3
1
4
2
5
6
1
5
9
3
7
2
0
1
2
3
4
5
6
7
dummy spare
1
6
PrimeiroItem:items[next[head]]
SegundoItem:items[next[next[head]]]
spare:marcadordopróximoespaçovago.
dummy:marcadorespecialdofinaldalista.
9
5
cabeça
3
7
2
cauda
Vocêjápensounumbomusoparaa
abstraçãodelistaspormeiodearranjos?
“freelist”
AlocaçãoDinâmicadeMemória
ListasemLinguagensdeProgramação
•  Emalgumaslinguagensdeprogramaçãoesta
estruturadedadoséumWpoprimiWvoda
linguagem:
–  Lisp,Python,Haskell.
•  EmC++,temosestaestruturapormeioda
bibliotecaSTL,escritacomoprópriocoreda
LinguagemC++:
–  std::list,std::forward_list
Quizz
Qualoresultadodaseguinte
operação:sizeof(list::item)?
Cuidado:alinhamentoepaddingdas
estruturas!
Pilhas
(Stacks)
Umapilhanadamaisédoqueumalista
ondeasinserções,remoçõeseacessos
ocorremsempreemumaúnica
extremidade.
Pilhas:operações
•  UmTADpilhapodeserdefinidoatravésdas
seguintesoperações:
push:insereumnovoitemnotopodapilha.
pop:removeumitemdotopodapilha.
top:retornaoelementonotopodapilha
A
push(P)
P
push(I)
I
P
H
H
L
L
I
I
P
pop()
P
QualapolíWcadeacesso
implementadaporumapilha?
UmapilhaimplementaumapolíWcado
Wpo:oúlWmoaentrarseráoprimeiroa
sair–lastin,firstout(LIFO).
Quaissãoosusosdaestrutura
dedadospilha?
ALinguagemLuaeousodePilhas
Exemplo.lua
c=terralib.Coord2D:new(1.0,2.0)
x=c:getX()
LigaçãoLua<->C++:coord2d.cpp
voidlua_pop(lua_State*L,intn):
popsnelementsfromthestack.
voidlua_pushnumber(lua_State*L,
lua_Numbern):pushesafloatwithvaluen
ontothestack.
staticintCoord2D_getX(lua_State*L)
{
te::gm::Coord2D*c=*(te::gm::Coord2D**)lua_touserdata(L,1);
lua_pushnumber(L,c->x);
return1;
}
Comopodemosimplementar
umaestruturadedadospilha?
Vetores×Apontadores
Pilha:implementaçãopormeiodevetor
•  Estaimplementaçãodemanda:
–  Umvetorparaositens.
–  Marcadordotopodapilha
–  NúmeroMáximodeItens
itens
topo
5
tamanho
6
6
5
4
3
2
1
A
H
L
I
P
Discussão
Aula31/03/2015
stack.hpp:implementaçãodepilhas
emC/C++atravésdevetores.
Pilhas:implementaçãopormeiode
apontadores
Atenção:esta
topo
item
A
T
S
I
L
próximo
representaçãoestá
usandoumelemento
senWnelaoudummyou
nil.
Qualacomplexidadedasoperações
sobreumapilha?
•  push:insereumnovoitemnotopodapilha.
O(1)
•  pop:removeumitemdotopodapilha.
O(1)
•  top:retornaoelementonotopodapilha.
O(1)
Filas
(Queues)
Umafilanadamaisédoqueumalista
ondeasinserçõessãofeitasnuma
extremidadeeasremoçõesocorremna
outraextremidade.
Filas:operações
•  UmTADfilapodeserdefinidoatravésdasseguintes
operações:
enqueue:enfileiraumnovoitem.
dequeue:removeumitemdoiníciodafila.
first:retornaoprimeiroelementodafila
A
enqueue(F)
F
enqueue(I)
I
F
L
A
I
L
F
dequeue()
I
QualapolíWcadeacesso
implementadaporumafila?
UmafilaimplementaumapolíWcaemqueo
elementoaserremovidoésempreaquele
queentrouprimeiro,ouseja,oprimeiroa
entrarseráoprimeiroasair–firstin,first
out(FIFO).=>ordemdechegada!
Quaissãoosusosdaestrutura
dedadosfila?
Comopodemosimplementar
umaestruturadedadosfila?
VetoresxApontadores
Filas:implementaçãopormeiodearranjos
•  Estaimplementaçãodemandatrêsvariáveis:
–  Umvetorparaositens.
–  Ummarcadordoinciodafilaeoutrodofinal.
•  Invariantes:
head_ 0
head_==tail_=>filavazia
head_==tail_+1=>filacheia
tail_ 4
size_ 6
Obs.:Nossafilaserácircular!
q_
0
1
2
3
F
I
L
A
4
5
Filas:implementaçãopormeiodearranjos
•  Qualocouidadoespecialquedevemoster
paradisWnguirfilacheiadefilavazia?
–  Invariantes:
head_==tail_=>filavazia
head_==tail_+1=>filacheia head_ 0
tail_ 4
size_ 6
Obs.:Nossafilaserácircular!
q_
0
1
2
3
F
I
L
A
4
5
Operação:Enfileira
voidqueue::enqueue(charc)
{
std::size_tpos=(tail_+1)%size;
if(pos==head_)
throwstd::logic_error("Queueoverflow!");
q_[tail_]=c;
tail_=pos;
}
Operação:Desenfileira
charqueue::dequeue()
{
if(head_==tail_)
throwstd::logic_error("Queueunderflow!");
charc=q_[head_];
head_=(head_+1)%size;
returnc;
}
Filas:implementaçãopormeiodearranjos
head_ 0
tail_ 0
0
1
2
3
4
5
enqueue('G')
head_ 0
tail_ 1
0
G
1
2
3
4
5
enqueue('I')
head_ 0
0
1
tail_ 2
G
I
2
3
4
5
Filas:implementaçãopormeiodearranjos
head_ 0
tail_ 2
0
G
1
I
2
3
4
5
enqueue('L')
head_ 0
tail_ 3
0
G
1
I
2
L
3
4
5
enqueue('B')
head_ 0
0
1
2
3
tail_ 4
G
I
L
B
4
5
Filas:implementaçãopormeiodearranjos
head_ 0
tail_ 4
0
G
1
I
2
L
3
B
4
5
enqueue('E')
head_ 0
tail_ 5
0
G
1
I
2
L
3
B
4
E
5
enqueue('R')
(tail_+1)%size_==head_=>FilaCheia!
Obs.:Nossafilateránomáximon-1elementos!
Filas:implementaçãopormeiodearranjos
head_ 0
tail_ 0
0
1
2
3
4
dequeue()
head_==tail_=>FilaVazia!
5
Filas:implementaçãopormeiodearranjos
head_ 0
tail_ 5
0
G
1
I
2
L
3
B
4
E
5
4
E
5
5
dequeue()
head_ 1
tail_ 5
0
G
1
I
2
L
3
B
dequeue()
head_ 2
0
1
2
3
4
tail_ 5
G
I
L
B
E
Filas:implementaçãopormeiodearranjos
head_ 2
tail_ 5
0
G
1
I
2
L
3
B
4
E
5
4
E
5
5
dequeue()
head_ 3
tail_ 5
0
G
1
I
2
L
3
B
dequeue
head_ 4
0
1
2
3
4
tail_ 5
G
I
L
B
E
Filas:implementaçãopormeiodearranjos
head_ 4
tail_ 5
0
G
1
I
2
L
3
B
4
E
5
4
E
5
dequeue()
head_ 5
tail_ 5
0
G
1
I
2
L
3
B
dequeue
head_==tail_=>FilaVazia!
Filas:implementaçãopormeiodearranjos
head_ 4
tail_ 5
0
G
1
I
2
L
3
B
4
E
5
enqueue('R')
head_ 4
tail_ 0
0
G
1
I
2
L
3
B
4
E
5
R
enqueue('T')
head_ 4
0
1
2
3
4
5
tail_ 1
T
I
L
B
E
R
Discussão
queue.hpp:implementaçãodefilas
emC++atravésdevetores.
Filas:implementaçãopormeiodeapontadores
head
item
F
I
L
tail
L
próximo
Discussão
lqueue.hpp:implementaçãodefilas
emC++atravésdeapontadores.
Qualacomplexidadedasoperações
sobreumafila?
•  enqueue:enfileira.
O(1)
•  dequeue:desenfileira.
O(1)
•  first:retornaoelementodoiníciodafila.
O(1)
ConsideraçõesFinais
ConsideraçõesFinais
•  Asestruturasvistasnestaaulapossuemamplaaplicaçãona
CiênciadaComputação.
•  DiscuWremosdiversosalgoritmosnaspróximasaulasque
precisarãodoapoiodessasestruturas.
•  Tambémiremosaprofundarnasestruturasdedadosde
árvores.
•  OprojetodabibliotecaSTLdeC++éumdosmelhores
exemplosdousodetécnicasdeprogramaçãoeparadigmas
paradesenvolvimentodeestruturasdedadosgenéricas
eficientes.
ConsideraçõesFinais
AlexanderStepanov
MengLee
DavidMusser
ProjeWstaseDesenvolvedoresdabibliotecaC++Standard
TemplateLibrary(STL)
ReferênciasBibliográficas
ReferênciasBibliográficas
•  CORMEN,T.H.;LIESERSON,C.E.;RIVEST,R.L.;
STEIN,C.Introduc<ontoAlgorithms.2ªEdição.
MitPress,2001.
•  HOROWITZ,E.;SAHNI,S.;RAJASEKARAN,S.
ComputerAlgorithms.1ªEdição.Computer
SciencePress,1997.769p.
•  ZIVIANI,N.ProjetodeAlgoritmos:com
implementaçõesemPASCALeC.2ªEdição.
EditoraThomson,2005.552p.
ReferênciasBibliográficas
•  IERUSALIMSCHY,R.;FIGUEIREDO,L.H.;CELES,W.Passinga
LanguagethroughtheEyeofaNeedle.ACMQueue,v.9,n.
5,maio,pp.20-29,2011.
•  RAYMOND,E.S.TheLostArtofCStructurePacking.Online.
Disponívelem:<hlp://www.catb.org/esr/structure-packing>.
Acesso:12deAbrilde2016.
•  SAKS,D.PaddingandRearrangingStructureMembers.Dr.
Dobb’s,19set.2012.Online.Disponívelem:
hlp://www.drdobbs.com/cpp/padding-and-rearrangingstructure-member/240007649.Acesso:12deAbrilde2016.
ReferênciasBibliográficas
•  AlStevensInterviewsAlexStepanov.Dr.Dobb's
Journal.Online.Disponívelem:<
hlp://www.sgi.com/tech/stl/drdobbsinterview.html>.Acesso:12deAbrilde2016.
Exercícios
Exercícios
•  E-5.1.EmCeC++existealgumadiferença
práWcaemusarlaçosqueprocessemuma
matrizpelaslinhasoupelascolunas?
•  E-5.2.Seestendermosaperguntadoexercício
E-5.1aoscompiladoresFortran,qualseriaa
resposta?
Exercícios
•  E-5.3.ParWndodaimplementaçãodelistasencadeadas
simples(slist),disponívelnositedocurso,acrescenteas
seguintesoperações:
remove(v):removedalistaoprimeiroelementoaconterovalor
v.Qualacomplexidadedestaoperação?
splice_after(pos,L):transfereoselementosdalistaLpara
alistaoperada,colocandooselementosdeLapósaposiçãopos.
AlistaLficarávaziaaofinal.Otempodestaoperaçãodeveráser
O(k),ondekrepresentaonúmerodeelementosdalistaL.
reverse():inverteaordemdoselementosdalistaemtempo
O(n).
Atenção:Existemduasversõesdalistaencadeadasimples:umaparanúmerosinteirose
outraparaWposgeraisusandotemplates.Sevocêoptarpelalistadeinteiros,teráque
trocaraimplementaçãopeloWpochar.
Exercícios
• 
E-5.4.Implementeumalistaduplamenteencadeadapormeiodeapontadores.
Estalistadeverápossibilitar:
– 
– 
– 
– 
– 
– 
– 
– 
– 
– 
– 
– 
– 
– 
– 
– 
Recuperaroprimeiroelemento(front).
RecuperaroúlWmoelemento(back).
Recuperarosucessordoelementox(next).
Recuperaroantecessordoelementox(previous).
Inserirnacabeçadalista(push_front).
inserirnacauda(push_back).
inserirantesdeumaposiçãoespecíficax(insert).
Removerumelementoespecífico(erase).
Removeroprimeiroelemento(pop_front).
RemoveroúlWmoelemento(pop_back).
FundiroselementosdeumalistaL2aofinaldalistaL1(splice).
ParWcionarumalistaLemduaslistas,umaterminandonoelementoxeoutracomeçandono
elementox(split).
Reverteroselementosdalista(reverse).
Juntarduaslistasordenadasemumasó,tambémordenada(merge).
Limparalista(clear).
Dizersealistaéounãovazia(empty).
Atenção:Existemduasversõesdalistaduplamenteencadeada:umaparanúmerosinteiros
eoutraparaWposgeraisusandotemplates.Nenhumadelassuportatodasessasoperações.
Exercícios
•  E-5.5.UWlizaroTADPilhaparaimplementaruma
calculadoraaritméWcacomnotaçãopolonesa.
Vocêdeverálerumaexpressãonaformade
stringcomanotaçãoinfixaetransformá-laem
umastringcomanotaçãopós-fixa.AparWrda
notaçãopós-fixa,useumapilhaparateajudara
implementaraavaliaçãodaexpressão.Considere
apenasasoperaçõesaritméWcasbásicas.
•  Ex:
–  Entrada:5*(((9+8)*(4*6))+7)
–  Transformação:598+46**7+*
ExercíciosEspeciais
Aentreganãoéobrigatória!
ExercíciosEspeciais
•  E-5.6.Umapilhapermiteinserireremover
elementosapenasnumaextremidade(topoda
pilha).Umafilapermiteinseriremuma
extremidade(cauda)eremoverdaoutra
(cabeça).Projeteeimplementeumdeque
(double-endedqueue)pormeiodearranjos,de
formaapermiWrinserçõeseremoçõesnasduas
extremidas.Asquatrooperaçõesparainserire
removerelementosdosdoisladosdodeque
devemtercomplexidadeO(1).
ExercíciosEspeciais
•  E-5.7.ProjeteumalocadordememóriaemC
uWlizandolistasdeespaçovazio.SuaAPIdeveser
formadapelasseguintesfunções:
void*my_malloc(unsignednbytes):
Alocaumblocodenbyteseretornaumponteiroparaoinício
dobloco;
voidmy_free(void*ap):
Liberaumblocodememória.
voidprint_available_mem():
Imprimenatelaalistadeblocosvazios:
ExercíciosEspeciais
•  E-5.8.Projeteumalocadordememóriapara
pequenosobjetosemC++.Osblocosde
memóriagerenciadosdevemserdetamanho
fixoecompa‡veiscomotamanhodoobjeto
queuWlizaráessealocador.
Dica:alémdoprojetodoalocador,vocêterá
quesobrecarregarosoperadoresnew,new[],
deleteedelete[]naclassedeseusobjetos.
Fim!
Download