Você está na página 1de 10

11/09/2016

Pilhas

ProjetodeAlgoritmos|LinguagemC|I
ndice

Pilhas

Umapilhae
umaestruturadedadosqueadmiteremoa
odeelementoseinsera
odenovosobjetos.Mais
especi icamente,umapilha(=stack)e
umaestruturasujeitaa
seguinteregradeoperaa
o:sempreque
houverumaremoa
o,
oelementoremovidoe
oqueesta
naestruturaha
menostempo.
Emoutraspalavras,oprimeiroobjetoaserinseridonapilhae
ou
ltimoaserremovido.Essapol
ticae
conhecidapelasiglaLIFO(=LastInFirstOut).

Implementaoemumvetor
Suponhaquenossapilhaesta
armazenadaemumvetorpilha[0..N1].(Anaturezadoselementosdo
vetore
irrelevante:elespodemserinteiros,caracteres,ponteiros,etc.)Digamosqueapartedovetor
ocupadapelapilhae
pilha[0..t1].

O
ndicetindicaaprimeiraposia
ovagadapilhaet1e
o
ndicedotopodapilha.Apilhaesta
vaziaset
vale0echeiasetvaleN.Noexemploda igura,oscaracteresA,B,,Hforaminseridosnapilhanessa
ordem:
0

N1

Pararemover,outirar,umelementodapilhaestaoperaa
oe
conhecidacomodesempilhar(=topop)
faa
x=pilha[t]

Issoequivaleaopardeinstruo
es"t=1x=pilha[t]",nessaordem.E
claroquevoce
so
deve
desempilharsetivercertezadequeapilhana
oesta
vazia.
Parainserir,oucolocar,umobjetoynapilhaaoperaa
oe
conhecidacomoempilhar(=topush)faa
pilha[t++]=y
http://www.ime.usp.br/~pf/algoritmos/aulas/pilha.html

1/10

11/09/2016

Pilhas

Issoequivaleaopardeinstruo
es"pilha[t]=yt+=1",nessaordem.Antesdeempilhar,certi ique
sedequeapilhana
oesta
cheia,paraevitarumtransbordamento(=overlow).
E
convenienteembalaressasoperao
esempequenasfuno
es.Seosobjetoscomqueestamoslidandosa
o
caracteres,porexemplo,podemosescrever
chardesempilha(void){
returnpilha[t]
}
voidempilha(chary){
pilha[t++]=y
}

Estamossupondoaquiqueasvaria
veispilhaetsa
oglobais,istoe
,foramdeclaradasforadoco
digodas
funo
es.(Paracompletaropacote,precisar
amosdemaistre
sfuno
es:umaquecrieumapilha,umaque
veri iqueseapilhaesta
vaziaeumaqueveri iqueseapilhaesta
cheia.Vejaexerc
cioabaixo.)

Exerccios1
1.Suponhaque,diferentementedaconvena
oadotadanotexto,apartedovetorocupadapelapilhae
pilha[1..t].Escrevaoco
digodasfuno
esempilha,desempilha,pilhavaziaepilhacheia.
2.Escrevaumalgoritmoqueuseumapilhaparainverteraordemdasletrasdecadapalavradeumastring,
preservandoaordemdaspalavras.Porexemplo,paraastringESTEEXERCICIOEMUITOFACILo
resultadodeveserETSEOICICREXEEOTIUMLICAF.
3.M

(
1).Escrevaummo
dulopilhadechars.cqueimplemente
umapilhadecaracteres.Omo
dulodeveconterasfuno
escriapilha,empilha,desempilha,
pilhavazia,pilhacheia.Trateospara
metrosdapilha(ovetorpilhaeo
ndicet)comovaria
veisglobais
domo
dulo.Escrevatambe
mumainterfacepilhadechars.hparaomo
dulo.[Solua
o.]
4.P
.Suponhaqueoscaracteres1,2,3,4sa
ocolocados,nestaordem,
numapilhainicialmentevazia.Depoisdeempilharumcaractere,voce
podetirarzerooumaiselementosda
pilha.Cadaelementodesempilhadoe
impressonumafolhadepapel.Porexemplo,aseque
nciadeoperao
es
empilha1,empilha2,desempilha,empilha3,desempilha,desempilha,empilha4,desempilha,
produzaimpressa
odaseque
ncia2,3,1,4.Quaisdas24permutao
esde1,2,3,4podemserobtidasdessa
maneira?
5.[Sedgewick]Ofragmentodeprogramaabaixomanipulaumapilhadecaracteres.(Afuna
oespiapilha
devolveumaco
piadotopodapilha,masna
otiraesseelementodapilha.)Diga,emportugue
s,oqueo
fragmentofaz.Escrevaumfragmentodeco
digoequivalentequesejabemmaiscurtoemaissimples.
if(pilhavazia())empilha('B')
else{
if(espiapilha()!='A')empilha('B')
else{
while(!pilhavazia()&&espiapilha()=='A')
desempilha()
empilha('B')}}

Aplicao:parntesesecolchetes
Considereoproblemadedecidirseumadadaseque
nciadepare
ntesesecolchetesesta
bemformada(ou
seja,pare
ntesesecolchetessa
ofechadosnaordeminversaa
quelaemqueforamabertos).Porexemplo,a
seque
ncia
http://www.ime.usp.br/~pf/algoritmos/aulas/pilha.html

2/10

11/09/2016

Pilhas

(()[()])
esta
bemformada,enquanto([)]esta
malformada.Suponhaqueaseque
nciadepare
ntesese
colchetesesta
armazenadaemumastring(cadeiadecaracteres)s.Comoe
ha
bitoemC,ou
ltimo
caracteredastringe
'\0'(ocaracterenulo).
Usaremosumapilhapararesolveroproblema.Oalgoritmoe
simples:examineastringdaesquerdapara
adireitaeempilheospare
ntesesecolchetesesquerdosa
esperadequeapareamoscorrespondentes
pare
ntesesecolchetesdireitos.
Parasimpli icar,asvaria
veispilhaetsera
oglobais.Suporemostambe
mqueotamanhoNdovetorque
abrigaapilhae
maiorqueotamanhodastringeportantoapilhajamaistransborda.

#defineN100
charpilha[N]
intt
//Estafunodevolve1seastringscontmuma
//sequnciabemformadadeparntesesecolchetes
//edevolve0seasequnciamalformada.
intbemFormada(chars[]){
inti
criapilha()
for(i=0s[i]!='\0'++i){
charc
switch(s[i]){
case')':if(pilhavazia())return0
c=desempilha()
if(c!='(')return0
break
case']':if(pilhavazia())return0
c=desempilha()
if(c!='[')return0
break
default:empilha(s[i])
}
}
returnpilhavazia()
}
voidcriapilha(void){
t=0
}
voidempilha(chary){
pilha[t++]=y
}
chardesempilha(void){
returnpilha[t]
}
intpilhavazia(void){
returnt<=0
}

(Poder
amosoperarapilhadiretamente,seminvocarasfuno
esdemanipulaa
odapilha.Oresultado
seriabemmaiscurtoecompacto,masumpoucomenosleg
vel.)

http://www.ime.usp.br/~pf/algoritmos/aulas/pilha.html

3/10

11/09/2016

Pilhas

Exerccios2
1.De
umade inia
oformaldesequnciabemformadadepare
ntesesecolchetes.Sugesta
o:de
umade inia
o
recursiva.
2.Afuna
obemFormadafuncionacorretamenteseaseque
nciastemapenasdoiselementos?apenasum?
nenhum?
3.Considereafuna
obemFormada.Mostrequenoin
ciodecadaiteraa
osesta
bemformadaseesomentesea
seque
nciapilha[0..t1]s[i...]estiverbemformada.
4.Escrevaumaversa
odafuna
obemFormadaquealoqueapilhadinamicamente.
5.Digamosquenossoalfabetoconte
mapenasasletrasa,bec.Considereoseguinteconjuntodestringssobre
nossoalfabeto:c,aca,bcb,abcba,bacab,aacaa,bbcbb,Qualquerstringdesseconjuntotemaforma
WcM,sendoWumaseque
nciadeletrasqueso
conte
maebeMoinversodeW(ouseja,Me
Wlidodetra
s
parafrente).EscrevaumprogramaquedecidaseumastringXpertenceouna
oaonossoconjunto,ouseja,
decidaseXe
daformaWcM.

Outraaplicao:notaopolonesa
Nanotaa
ousualdeexpresso
esaritme
ticas,osoperadoressa
oescritosentreosoperandos;porisso,a
notaa
oe
chamadainixa.Nanotaa
oposixa,oupolonesa,osoperadoressa
oescritosdepoisdos
operandos.Eisalgunsexemplosdeexpresso
esin ixasecorrespondentesexpresso
espos ixas:
in ixa

pos ixa

(A+B*C)
(A*(B+C)/DE)
(A+B*(CD*(EF)G*H)I*3)
(A+B*C/D*EF)
(A+B+C*DE*F*G)
(A+(B(C+(D(E+F)))))
(A*(B+(C*(D+(E*(F+G))))))

ABC*+
ABC+*D/E
ABCDEF*GH**+I3*
ABC*D/E*+F
AB+CD*+EF*G*
ABCDEF+++
ABCDEFG+*+*+*

Notequeosoperandos(A,B,C,etc.)aparecemnamesmaordemnaexpressa
oin ixaenacorrespondente
expressa
opos ixa.Notetambe
mqueanotaa
opos ixadispensaparnteseseregrasdeprecednciaentre
operadores(comoaprecede
nciade*sobre+porexemplo),quesa
oindispensa
veisnanotaa
oin ixa.
Nossoproblema:traduzirparanotaa
opos ixaaexpressa
oin ixaarmazenadaemumastringinf.Para
simpli icarnossavida,vamossuporque
aexpressa
oinfe
va
lidaeconte
mapenasletras,pare
ntesesesquerdos,pare
nteses
direitos,es
mbolosparaasquatrooperao
esaritme
ticas,
todasasoperao
es(emparticulare+)te
mdoisoperandos,
osnomesdasvaria
veiste
mapenasumaletracada,
aexpressa
oinfesta
embrulhadaemumpardepare
nteses(ouseja,oprimeiro
caracteree
'('eosdoisu
ltimossa
o')'e'\0').
Oalgoritmole
aexpressa
oinfcaractereacaractereeusaumapilhaparafazeratradua
o.Todo
pare
nteseesquerdoe
colocadonapilha.Aoencontrarumpare
ntesedireito,oalgoritmodesempilhatudo
ate
oprimeiropare
nteseesquerdoinclusive.Aoencontrarum+ouum,oalgoritmodesempilhatudoate
umpare
nteseesquerdoexclusive.Aoencontrarum*ouum/,oalgoritmodesempilhatudoate
um
pare
nteseesquerdoouum+ouum.Constantesevaria
veissa
otransferidosdiretamentedeinfparaa
expressa
opos ixa.(Vejaumrascunhoempseudoco
digo.)
Asvaria
veispilhaetsa
oglobais.VamossuporqueotamanhoNdapilhae
maiorqueotamanhoda
stringinf,eportantona
oprecisamosnospreocuparcompilhacheia.Comoaexpressa
oinfesta
http://www.ime.usp.br/~pf/algoritmos/aulas/pilha.html

4/10

11/09/2016

Pilhas

embrulhadaempare
nteses,na
oprecisamosnospreocuparcompilhavazia.
#defineN100
charpilha[N]
intt
//Estafunorecebeumaexpressoinfixainf
//edevolveacorrespondenteexpressoposfixa.
char*infixaParaPosfixa(char*inf){
char*posf
inti,j
n=strlen(inf)
posf=mallocc((n+1)*sizeof(char))
criapilha()
empilha(inf[0])//empilha'('
for(j=0,i=1inf[i]!='\0'++i){
switch(inf[i]){
charx
case'(':empilha(inf[i])
break
case')':x=desempilha()
while(x!='('){
posf[j++]=x
x=desempilha()
}
break
case'+':
case'':x=desempilha()
while(x!='('){
posf[j++]=x
x=desempilha()
}
empilha(x)
empilha(inf[i])
break
case'*':
case'/':x=desempilha()
while(x!='('&&x!='+'&&x!=''){
posf[j++]=x
x=desempilha()
}
empilha(x)
empilha(inf[i])
break
default:posf[j++]=inf[i]
}
}
posf[j]='\0'
returnposf
}

(Poder
amosoperarapilhadiretamente,seminvocarasfuno
esdemanipulaa
odapilha.Oresultado
seriamaiscurtoecompacto,masumpoucomenosleg
vel.)
Vejaoresultadodaaplicaa
odafuna
oinfixaParaPosfixaa
expressa
oin ixa(A*(B*C+D)).Atabela
registraosvaloresdasvaria
veisnoin
ciodecadaiteraa
o:
inf[0..i1]

pilha[0..t1] posf[0..j1]

(
(A
(A*
(A*(

(
(
(*
(*(

http://www.ime.usp.br/~pf/algoritmos/aulas/pilha.html

A
A
A
5/10

11/09/2016

Pilhas

(A*(B
(A*(B*
(A*(B*C
(A*(B*C+
(A*(B*C+D
(A*(B*C+D)
(A*(B*C+D))

(*(
(*(*
(*(*
(*(+
(*(+
(*

AB
AB
ABC
ABC*
ABC*D
ABC*D+
ABC*D+*

Exerccios3
1.Useafuna
oinfixaParaPosfixaparaconverteraexpressa
oin ixa(A+B)*D+E/(F+A*D)+Cnaexpressa
o
pos ixaequivalente.
2.Nafuna
oinfixaParaPosfixa,quetamanhoapilhapodeatingirnopiorcaso,emfuna
oden?Emoutras
palavras,qualovalorma
ximodavaria
veltnopiorcaso?Queaconteceseonu
merodepare
ntesesesquerdos
naexpressa
oforlimitado(menorque6,porexemplo)?
3.Reescrevaafuna
oinfixaParaPosfixasemsuporqueaexpressa
oin ixaesta
embrulhadaemumparde
pare
nteses.
4.Reescrevaafuna
oinfixaParaPosfixaeasfuno
esdemanipulaa
odapilhademodoqueovetorpilha
sejaalocadodinamicamente.
5.Reescrevaafuna
oinfixaParaPosfixasupondoqueaexpressa
opodetercolchetesale
mdepare
nteses.
6.Reescrevaafuna
oinfixaParaPosfixasupondoqueaexpressa
opodena
oserva
lida.
7.V
.Suponhaqueposfe
umastringna
ovaziaqueguardaumaexpressa
o
aritme
ticaemnotaa
opos ixa.Suponhaqueposfconte
msomenteosoperadores+,,*e/(todosexigem
doisoperandos).Suponhatambe
mqueaexpressa
ona
otemconstantesequetodososnomesdevaria
veisna
expressa
oconsistememumau
nicaletramaiu
scula.Suponhaaindaquetemosumvetorvalorqueda
os
valoresdasvaria
veis(todosinteiros):
valor[0]e
ovalordavaria
velA,
valor[1]e
ovalordavaria
velB,etc.

Escrevaumafuna
oquecalculeovalordaexpressa
oposf.Cuidadocomdiviso
esporzero!

Implementaoemvetorcomredimensionamento
Nemsempree
poss
velpreveraquantidadedeespaoquedeveserreservadaparaabrigarapilhade
modoaevitartransbordamentos.Podemos,enta
o,redimensionarovetortodavezqueapilha icarcheia
(comoja
izemoscomaimplementaa
ode ila).

Exerccios4
1.M

(
2).Escrevaummo
dulopilhadechars.cqueimplemente
umapilhadecaracteresnumvetorcomredimensionamento.Omo
dulodeveconterasfuno
escriapilha,
empilha,desempilha,pilhavaziaeliberapilha.Trateospara
metrosdapilhacomovaria
veis
globaisdomo
dulo.Escrevatambe
mumainterfacepilhadechars.hparaomo
dulo.

Pilhaimplementadaemumalistaencadeada
http://www.ime.usp.br/~pf/algoritmos/aulas/pilha.html

6/10

11/09/2016

Pilhas

Comoimplementarumapilhadecaracteresemumalistaencadeada?Digamosqueasce
lulasdalistasa
o
dotipocelula:
typedefstructreg{
charconteudo
structreg*prox
}celula

Deciso
esdeprojeto:Nossalistatera
umace
lulacabea(eportantoaprimeirace
luladalistana
ofazparte
dapilha).Umavaria
velglobalapontara
acabeadalista:
celula*pi

Otopodapilha icara
nasegundace
lulaena
onau
ltima(porque
?).Asfuno
esdecriaa
oemanipulaa
o
dapilhapodementa
oserescritasassim:
voidcriapilha(void){
pi=mallocc(sizeof(celula))//cabea
pi>prox=NULL
}
voidempilha(chary){
celula*nova
nova=mallocc(sizeof(celula))
nova>conteudo=y
nova>prox=pi>prox
pi>prox=nova
}
chardesempilha(void){
charx
celula*p
p=pi>prox
x=p>conteudo
pi>prox=p>prox
free(p)
returnx
}

(Comodeha
bito,afuna
odesempilhasupo
equeapilhana
oesta
vazia.)

Exerccios5
1.Implementeumpilhaemumalistaencadeadasemce
lulacabea.Apilhasera
dadapeloendereodaprimeira
ce
luladalista(quee
otopodapilha).
2.Reescrevaasfuno
esbemFormadaeinfixaParaPosfixaarmazenandoapilhaemumalistaencadeada.

Apndice:Apilhadeexecuodeumprograma
TodoprogramaCconsisteemumaoumaisfuno
es(sendomainaprimeirafuna
oaserexecutada).Para
administrarasinvocao
esdefuno
es,ocomputadorusaumapilhadeexecuo.(VejaoverbeteCallstack
naWikipedia.)Aoperaa
opodeserdescritaconceitualmentedaseguintemaneira:
Aoencontrarainvocaa
odeumafuna
o,ocomputadorcriaumnovo"espaodetrabalho",queconte
m
todosospara
metrosetodasasvaria
veislocaisdafuna
o.Esseespaodetrabalhoe
colocadonapilhade
execua
o(porcimadoespaodetrabalhoqueinvocouafuna
o)eaexecua
odafuna
ocomea
http://www.ime.usp.br/~pf/algoritmos/aulas/pilha.html

7/10

11/09/2016

Pilhas

(con inadaaoseuespaodetrabalho).Quandoaexecua
odafuna
otermina,oseuespaodetrabalhoe
removidodapilhaedescartado.Oespaodetrabalhoqueestiveragoranotopodapilhae
reativadoea
execua
oe
retomadadopontoemquehaviasidointerrompida.
Considereoseguinteexemplo:
intG(inta,intb){
intx
x=a+b
returnx
}
intF(inti,j,k){
intx
x=/*2*/G(i,j)/*3*/
x=x+k
returnx
}
intmain(void){
inti,j,k,y
i=111j=222k=444
y=/*1*/F(i,j,k)/*4*/
printf("%d\n",y)
returnEXIT_SUCCESS
}

Aexecua
odoprogramaprosseguedaseguintemaneira:
Umespaodetrabalhoe
criadoparaafuna
omainecolocadonapilhadeexecua
o.Oespao
conte
masvaria
veislocaisi,j,key.Aexecua
odemaincomea.
Noponto1,aexecua
odemaine
temporariamenteinterrompidaeumespaodetrabalhoparaa
funa
oFe
colocadonapilha.Esseespaoconte
mospara
metrosi,j,kdafuna
o(comvalores111,
222e444respectivamente)eavaria
vellocalx.Comeaenta
oaexecua
odeF.
Noponto2,aexecua
odeFe
interrompidaeumespaodetrabalhoparaafuna
oGe
colocadona
pilha.Esseespaoconte
mospara
metrosaebdafuna
o(comvalores111e222respectivamente)
eavaria
vellocalx.Emseguida,comeaaexecua
odeG.
Quandoaexecua
odeGtermina,afuna
odevolve333.OespaodetrabalhodeGe
removidoda
pilhaedescartado.OespaodetrabalhodeF(queagoraesta
notopodapilhadeexecua
o)e
reativadoeaexecua
oe
retomadanoponto3.Aprimeirainstrua
oexecutadae
"x=333".
Quandoaexecua
odeFtermina,afuna
odevolve777.OespaodetrabalhodeFe
removidoda
pilhaedescartado.Oespaodetrabalhodemain(queagoraesta
notopodapilha)e
reativadoea
execua
oe
retomadanoponto4.Aprimeirainstrua
oexecutadae
"y=777".
Nonossoexemplo,FeGsa
ofuno
esdistintas.MastudofuncionariadamesmamaneiraseFeGfossem
ide
nticas,ouseja,seFfosseumafuna
orecursiva.

Exerccios6
1.Escrevaumafuna
oiterativaquesimuleocomportamentodaseguintefuna
orecursiva.Useumapilha.
intTTT(intx[],intn){
if(n==0)return0
if(x[n]>0)returnx[n]+TTT(x,n1)
elsereturnTTT(x,n1)
}

2.P
.(Esteexerc
ciona
oso
simulaofuncionamentodapilhadeexecua
ocomo
tambe
moprocessamentodasdiretivas#includee#definedopre
processadordocompiladorC.)Escreva
umprogramaquerecebaumarquivodetextoegraveoutroarquivodetextocomoespeci icadoaseguir.Cada
http://www.ime.usp.br/~pf/algoritmos/aulas/pilha.html

8/10

11/09/2016

Pilhas

linhadoarquivodeentradaconte
mpalavrasseparadasporespaos;aspalavrasquecomeamcom#sa
o
especiaiseasoutrassa
onormais.Oarquivodesa
dacontera
aspalavrasnormais,emumaso
linha,numacerta
ordem.Suponha,porexemplo,queoarquivodeentradaconte
masseguinteslinhas(osnu
merosnoin
ciodas
linhaservemapenasderefere
nciaena
ofazempartedoarquivo):
0#4aaa#2
1bbb
2CC#4DDD#1ee
3FF#2#4
4GGhhh

Enta
ooarquivodesa
da,devera
conter
GGhhhaaaCCGGhhhDDDbbbee

Comooexemplosugere,aspalavrasespeciassa
osubstitu
daspelalinhadoarquivodeentradacujonu
meroe
dadodepoisdocaractere'#',eissodeveserfeitorecursivamente.Paratornaroexerc
ciomaisinteressante,
na
ousefuno
esrecursivas.

Perguntaserespostas
P:Apadronizaa
oANSIdalinguagemCexigequeoscomenta
riossejamembrulhadosem/*e*/.
Porqueoscomenta
riossa
oindicadospor//nosexemplosacima?
R:Euachoaconvena
o//maissimplesemaispra
tica.Masrecomendoquevoce
obedeaopadra
o
ANSIeescreva/*comentrio*/paraqueseusprogramassejamaceitospelocompiladorgcccomopa
o
ansi.

VejaoverbeteStack(datastructure)naWikipedia
Atualizadoem20160401
http://www.ime.usp.br/~pf/algoritmos/
PauloFeoiloff
DCCIMEUSP

http://www.ime.usp.br/~pf/algoritmos/aulas/pilha.html

9/10

11/09/2016

http://www.ime.usp.br/~pf/algoritmos/aulas/pilha.html

Pilhas

10/10