Pilhs Pilhs Pilh é um tipo e list one tos s operções e inserção e remoção são feits n mesm extremie (Topo). O primeiro entrr é o último sir e o último entrr o primeiro sir (LIFO Lst-In First-Out). Trt-se e um estrutur inâmi (poe umentr ou iminuir urnte existêni). Exemplos Físios: Gurnpo o topo Entr Si Topo Um pilh e prtos mol Um port-gurnpos Suport três operções ásis: Top (topo) ess o elemento o topo. Push (empure) insere um elemento no topo. Pop (slte) remove um elemento o topo. Exemplo e Instruções Top(P) ess o elemento lolizo no topo Pilh P. Pop(P) remove e retorn o elemento posiiono no topo Pilh P (iminui o tmnho pilh). Push(P, X) resent o elemento X no topo Pilh P (ument o tmnho pilh). Págin 1
Pilhs Exemplo o uso s instruções Pilh (representção liner). Operção Esto Pilh Resulto ----------------- P:[ ] --------------- Push(P, ) P:[ ] --------------- Push(P, ) P:[, ] --------------- Push(P, ) P:[,, ] --------------- Pop(P) P:[, ] Pop(P) P:[ ] Push(P, ) P:[, ] --------------- Push(P, e) P:[ e,, ] --------------- Top(P, ) P:[ e,, ] e Pop(P, ) P:[, ] e Pop(P, ) P:[ ] Representção gráfi s Pilhs n topo P:[ n, n 1,..., 2, 1 ] n - 1... 2 1 se Exemplos e operções om Pilh e su representção gráfi. Push(P, ) Push(P, ) Push(P, ) Pop(P) Pop(P) e Push(P, ) Push(P, e) Pop(P) Pop(P) Pop(P) Págin 2
Pilhs Vntgens representção Gráfi - Gráfios são interpretos mis rpimente. - É mis efiiente, pois sugere que nenhum elemento preis ser esloo urnte inserção ou remoção. Limites Pilh No muno rel um pilh é limit pelo hão e pelo teto. * Não é possível inserir elementos infinitmente. * Não é possível remover elementos infinitmente. No omputor os limites pilh se refere quntie e memóri us pr representá-l. Operções Esseniis pr um Pilh Init: iniiliz um pilh no esto vzi ; Init(P) IsEmpty: verifi se pilh está vzi; IsEmpty(P) IsFull: verifi se pilh está hei. IsFull(P) Exemplo em Psl o uso e Pilhs. Progrm pr onverter eiml em inário progrm De_Bin; uses Pilhs; vr P: Pilh; x, n: integer; writeln ( Digite um inteiro eiml positivo: ); reln (n); Init(P); {torn pilh vzi} repet x:= n mo 2; Push (P, x); n:= n iv 2; until n=0; {lul o resto} {empilh o resto} (lul quoiente) {quoiente 0, pár} write ( Corresponente inário: ); while not IsEmpty(P) o x:= Pop(P); write(x); en. {pilh vzi, pár} {esempilh o resto} {imprime o resto} Págin 3
Pilhs Pilhs no ontrole e hms e retornos rotins 1. progrm Pilhs; 2. vr 3. 4. proeure um; 5. 6. writeln( Um ); 7. ois; 8. 9. 10. proeure ois; 11. 12. writeln( Dois ); 13. tres; 14. 15. 16. proeure tres; 17. 18. writeln( Três ); 19. 20. 21. 22. um; 23. ois; 24. tres; 25. en. Seqüêni e linhs rmzenos n Pilh: 14 8 8 8 14 23 23 23 23 23 24 24 24 25 Exeríios 1. Mostre situção pilh P, iniilmente vzi, pós exeução e um s operções seguir: Push (P, ); Push (P, ); Push (P, ); Push (P, Top (P)); Push (P, Pop (P)); Pop (P); Push (P, e); Pop (P); Págin 4
Pilhs 1º Resolução (vertil) 2º Resolução (horizontl) Push (P, ); Push (P, ); Push (P, Pop (P)); Push (P, ); Push (P, ); Push (P, ); Pop (P); Push (P, Top (P)); Push (P, ); Push (P, Pop (P)); Push (P, e); e Pop (P); Push (P, Top (P)); e e Push (P, ); e Push (P, Top (P)); Pop (P); 2. Usno um pilh, esrev um progrm pr ler um frse e imprimi-l e trás pr frente (om s letrs invertis omo um espelho). Págin 5
Pilhs progrm Inverte; uses Pilhs; vr P: Pilh; x, n: integer; f:string; writeln ('Entre om um frse: '); reln (f); Init(P); {torn pilh vzi} for n:=1 to length(f) o push(p, f[n]); while not IsEmpty(P) o {pilh vzi, pr} write(pop(p)); en. 3. Esrev um rotin que us um pilh pr verifir se um ei e rteres é uo não plínrom. Exemplo: suinoonius é um plvr plínrom. progrm Plinrom; uses Pilhs; vr E, S: string; i: integer; P: Pinh; writeln( Frse: ); reln(e); {otém frse norml} Init(P); for i:=1 to length(e) o Push(P,S[i]); {põe rteres n pilh} S:= ; while not IsEmpty(P) o {ri frse inverti} S:=S+Pop(P); if E=S then writeln( A frse é plínrom ); writeln( A frse não é plínrom ); en. Este Exeríio exemplifi função ási e um pilh: rir funções! Vemos in que função IsEmpty(), em onjunto omo omno while, é iel pr oifir um looping que esvzi pilh, e que o operor +, em Psl, poe ser uso pr nexr um rtere o finl e um ei (ou pr ontenr us eis quisquer!). 4. Consierno s ilustrções seguir, mostre sequêni e operções Push e Pop que evem ser relizs sore s pilhs X, Y e Z pr que, prtino o esto iniil, possmos hegr o esto finl. Págin 6
Pilhs ) (X) (Y) (Z) esto iniil (X) (Y) (Z) esto finl ) 1 8 4 4 2 1 8 3 3 2 (X) (Y) (Z) (X) (Y) (Z) esto iniil esto finl Resolução A Push(Y, Pop(X)) Push(Y, Pop(X)) Push(X, Pop(Y)) Push(Z, Pop(Y)) Resolução B Push(Y, Pop(X)) Push(Y, Pop(X)) Push(Y, Pop(X)) Push(X, Pop(Y)) Push(X, Pop(Y)) Push(Z, Pop(Y)) 5. Esquemtize situção pilh e ontrole e progrm, em momento urnte exeução, pr os progrms seguir: ) routine A 1 print A 2 ll B 3 return routine B 4 ll C 5 ll D 6 return routine C 7 ll D 8 print C 9 return routine D 10 print D 11 return Págin 7
Pilhs ) routine A 1 print A 2 ll B 3 return routine B 4 print B 5 ll C 6 return routine C 7 print C 8 ll B 9 return Resolução A Resolução B P: [ ] P: [3] P: [5,3] P: [8,5,3] P: [5,3] P: [3] P: [6,3] P: [3] P: [ ] P: [] P: [3] P: [6,3] P: [9,6,3] P: [6,9,6,3] P: [9,6,9,6,3] Implementção e Pilhs em Psl Crterístis Pilh: os elementos são rmzenos em seqüêni. inlusão e exlusão não requer movimentção e os. Por esss rterístis loção sequenil é propri. Pr tl poem ser usos: Vetor: rmzen os elementos Pilh. Ínie: permite o esso os elementos. Pr rir um pilh poe ser us estrutur RECORD: 1. onst MAX = 50; 2. type Elem = hr; 3. Pilh = reor 4. topo: integer; 5. memo: rry[1..max] of Elem; 6. 7. vr P: Pilh; Págin 8
Pilhs Exemplo e rmzenmento Pilh P[,, ] P.memo rmzen os elementos pilh P: 3... 1 2 3 4 5 6 7... MAX Bse P.topo ini posição o último elemento inserio Algoritmos pr Mnipulção Pilh ) Iniilizção Pilh proeure Init(vr P:Pilh); P.topo:= 0; Consierções: Não é neessário triuir vlores iniiis os elementos o vetor o iniilizr pilh (irrelevnte). Como o vetor possui elementos entre 1..MAX, não poe hver onteúo n posição 0. P.memo rmzen vlores inefinios P: Φ??????...?? P.topo mntém o ínie o último elemento inserio. O rgumento P, reeio pel rotin Init, é pssgem por referêni (possiilit que qulquer pilh sej iniiliz, inepenentemente e seu nome). ) Limites Pilh 1 2 3 4 5 6 7... MAX P.topo om vlor Φ ini que pilh está vzi, pois não há nenhum elemento ness posição (Pilh vzi P:[ ]). funtion IsEmpty(vr P:Pilh): oolen; if P.topo= 0 then IsEmpty:= true IsEmpty:= flse; Verifi o hão (Topo=0) Págin 9
Pilhs funtion IsFull(vr P:Pilh): oolen; if P.topo = mx then IsFull:= true IsFull:= flse; Verifi o hão (Topo=0) Consierções Por que usr função no lugr e proeimento? Quno Pilh está vzi? Quno Pilh está hei? A pssgem por referêni é, ms não origtóri, um vez que não existe neessie e se lterr o vlor Pilh. Entretnto, não é neessário rir um nov vriável pr opir pilh n memóri (qunto > MAX > Tempo) ) Inserino elementos n Pilh. proeure Push(vr P:Pilh; x:elem); if not IsFull(P) then P.topo:= P.topo + 1; P.memo[P.topo]:= x; en writeln( Stk Overflow! ); Consierções: Existe espço? Se não, oorre Stk Overflow. Inserir o novo elemento no topo. Inrementr o vlor o topo. IsFull (P) verifi se há espço n pilh (1) P.topo := P.topo + 1 lter posição o topo pilh (2) Pssos ásios pr inserir um elemento n pilh P.memo [ P.topo ] := x rmzen o elemento (3) Págin 10
Pilhs ) Retirno elementos Pilh. proeure Pop(vr P:Pilh):Elem; if not IsEmpty (P) then Pop := P.memo [P.topo]; P.topo:= P.topo - 1; en writeln( Stk Overflow! ); Consierções: A Pilh está vzi? Remover sempre o topo. Retornr o elemento e erementro topo. Ao tentr retirr um elemento om Pilh vzi oorre Stk Unerflow. A remoção é pens lógi. IsEmpty (P) verifi se há elementos n pilh (1) e) Conheeno o elemento o topo funtion Top(vr P:Pilh):Elem; if not IsEmpty(P) then Top:= P.memo[P.topo] writeln ( Stk Unerflow ); Consierções: Não lter o esto Pilh. Retorn o elemento o topo. P.topo := P.topo + 1 lter posição o topo pilh (2) Pssos ásios pr remover um elemento pilh P.memo [ P.topo ] := x rmzen o elemento (3) Unit Pilhs unit Pilhs; interfe Págin 11
Pilhs onst mx = 50; type Elem = hr; Pilh = reor topo: integer; memo: rry[1..mx] of Elem; proeure Init(vr P:Pilh); funtion IsEmpty(vr P:Pilh):oolen; funtion IsFull(vr P:Pilh):oolen; proeure Push(vr P:Pilh; x:elem); funtion Pop(vr P:Pilh):Elem; funtion Top(vr P:Pilh):Elem; implementtion proeure Init(vr P:Pilh); P.topo: = 0; funtion IsEmpty(vr P:Pilh):oolen; if P.topo= 0 then IsEmpty:= true IsEmpty:= flse; funtion IsFull(vr P:Pilh):oolen; if P.topo= mx then IsFull:= true IsFull:= flse; proeure Push(vr P:Pilh; x:elem); if not IsFull(P) then P.topo:= P.topo + 1; P.memo[P.topo]:= x; en writeln ( Stk Overflow! ); proeure Pop(vr P:Pilh):Elem; if not IsEmpty(P) then Pop:= P.memo [P.topo]; P.topo:= P.topo - 1; en writeln ( Stk Overflow! ); funtion Top(vr P:Pilh):Elem; Págin 12
Pilhs if not IsEmpty (P) then Top:= P.memo[P.topo] writeln ( Stk Unerflow! ); en. Exeríios: 1. Um lterntiv pr orgnizr os os e um pilh onsiste no uso e um vetor M[0..n], one M[0] é uso pr mnter o ínie e topo e M[1], M[2],..., M[n] são usos pr rmzenr os elementos ontios n pilh: ) Que restrição existe o tipo os elementos que pilh poerá ontém? R: Como pilh é ri prtir e um vetor, os elementos pilh evem ser toos o mesmo tipo (inteiro, rel, hr...) slvo quno em tipo poss ser onvertio em outro tipo. ) Esquemtize representção gráfi pr pilh P:[,,, ]. (P) Topo Bse ) Implemente s rotins pr inserir e remover elementos pilh. 2. É possível mnter us pilhs num únio vetor, stno que um pilh tenh omo se primeir posição o vetor e outr, últim. As pilhs terão e reser um e enontro à outr. Pilh esquer Pilh ireit 5... z y x n-3 1 2 3 4 5... n-3 n-2 n-1 n ) Qul vntgem o esquem e rmzenmento, om relção espço? R: Usr us pilhs om o espço reservo pens um. Desvntgem: os elementos preism ser o mesmo tipo. ) Implemente o tipo Pilh, utilizno est orgnizção e os. Págin 13