Unidade 3_ Pilhas, Alocação Sequencial e Estática.pdf

Download Unidade 3_ Pilhas, Alocação Sequencial e Estática.pdf

Post on 02-Dec-2015

140 views

Category:

Documents

1 download

Embed Size (px)

TRANSCRIPT

<ul><li><p>14/05/13 Unidade 3: Pilhas, Alocao Sequencial e Esttica</p><p>www2.dc.ufscar.br/~bsi/materiais/ed/u3.html 1/14</p><p> Unidade 3</p><p>Pilhas, Alocao Seqencial e Esttica </p><p>O que um stack overflow? </p><p>Nossos Objetivos nesta Unidade:- Entender o que e para que serve uma estrutura do tipo Pilha, o que alocao seqencial de</p><p>memria, e o que alocao esttica de memria, no contexto do armazenamento deconjuntos de elementos;</p><p>- Desenvolver a habilidade para implementar uma estrutura de armazenamento do tipo Pilha,como um Tipo Abstrato de Dados, com alocao seqencial e esttica de memria;</p><p>- Desenvolver a habilidade para manipular Pilhas atravs dos operadores definidos para o TipoAbstrato de Dados Pilha.</p><p> O Que uma Pilha?</p><p>A Pilha da qual estamos falando no uma pilha no sentido de bateria para o controle remoto. Estamosfalando de uma pilha de pratos, pilha de potes, pilha de livros, pilha de cartas. Ou seja, o sentido deempilhar coisas (Figura 3.1). </p><p>Pilha de Potes Pilha de Livros Pilha de Pratos Pilha de Cartas </p><p>Imagens: Yew Tree Gallery (potes), iSstockPhoto (livros), Darren Maurer (pratos), e Barbosa, Miyoshi, e Gomes (cartas)</p><p>Figura 3.1 Ilustrao do conceito de Pilha - sentido empilhar Em uma pilha de pratos, no possvel retirar um prato que no esteja no topo da pilha, se no a pilha vaidesmoronar. Tambm no possvel inserir um prato fora do topo. Essencialmente, esse o funcionamentode uma pilha. </p><p> Definio: Pilha</p><p>Pilha uma estrutura para armazenar um conjunto de elementos, que funciona da seguinte forma: Novos elementos entram no conjunto, exclusivamente, no topo da pilha;</p></li><li><p>14/05/13 Unidade 3: Pilhas, Alocao Sequencial e Esttica</p><p>www2.dc.ufscar.br/~bsi/materiais/ed/u3.html 2/14</p><p> O nico elemento que posso retirar da pilha em um dado momento, o elemento do topo. Do Ingls: Stack, LIFO</p><p>Uma Pilha (em Ingls: Stack) uma estrutura que obedece o critrio L.I.F.O.: Last In, First Out. Ou seja, oltimo elemento que entrou no conjunto ser o primeiro a sair. </p><p> Uma Pilha um conjunto ordenado de elementos, ou seja, a ordem dos elementos no conjunto importante.Se eu tenho trs elementos em uma pilha, A, B e C, e se eles entraram na pilha nessa ordem, o elementoque estar no topo da pilha ser o elemento C. E se eu quiser retirar um elemento nesse momento, o nicoelemento que poderei retirar da pilha ser exatamente o elemento C (Figura 3.2). </p><p> C B A </p><p> Figura 3.2 Pilha com trs elementos A, B e C; C est no topo da pilha Considerando ainda o exemplo da Figura 3.2, se quisermos inserir um elemento D na pilha nesse momento,este elemento passaria a ser o elemento do topo da pilha, conforme mostra a Figura 3.3. </p><p> D C B A </p><p> Figura 3.3 Pilha com quatro elementos A, B, C e D; D est no topo da pilha E se a ordem de insero dos elementos na pilha tivesse sido outra, por exemplo, B, C, D, A, a pilharesultante seria outra (Figura 3.4). </p><p> A D C B </p><p> Figura 3.4 Pilha com quatro elementos, ordem de insero: B, C, D A Simulao 3.1: Operaes de uma PilhaTeste o funcionamento das operaes Empilha e Desempilha, interagindo com a Simulao 3.1: Operaesde uma Pilha. Para Que serve uma Pilha? O Exemplo da Chamada de Subprogramas</p><p>Ao elaborar um programa de computador voc j se deparou com um erro de execuo chamado stack</p></li><li><p>14/05/13 Unidade 3: Pilhas, Alocao Sequencial e Esttica</p><p>www2.dc.ufscar.br/~bsi/materiais/ed/u3.html 3/14</p><p>overflow? Sabe o que significa stack overflow? Sabe como ocorre? um erro bastante comum. Se aindano aconteceu com voc, provavelmente ainda vai acontecer. Um computador est executando um trecho de programa A, e durante a execuo de A encontra o comandoCall B. Ou seja, uma chamada a um subprograma B. O computador precisa parar de executar A, executar B,e retornar ao programa A no ponto onde parou. Como o computador faz para lembrar a posio exata paraonde deve retornar? Essa questo pode se complicar se tivermos vrias chamadas sucessivas. Considere o exemplo da Tabela 3.1. Temos um programa principal, A, e 3 subprogramas: B, C e D. Ao</p><p>iniciarmos a execuo de A, na linha 1 temos o comando Print A, que imprime a letra A. Depois temos ocomando Call C, ou seja, uma chamada ao subprograma C. Nesse ponto temos que interromper a execuode A e iniciar a execuo do subprograma C. Ao finalizar a execuo do subprograma C (comando Return,subprograma C linha 3), precisamos retomar a execuo de A na linha 3, porque as linhas 1 e 2 de A jforam executadas. Programa A (principal)1 print A2 call C3 call B4 call D5 return </p><p>Subprograma B1 call C2 print B3 call D4 call C5 return </p><p>Subprograma C1 print C2 call D3 return </p><p>Subprograma D1 print D2 return</p><p>Print A = imprime a letra A; call C = chama o subprograma C; return = fim do programa ousubprograma</p><p>Tabela 3.1 Programa A e subprogramas B, C e D A propsito, tente executar, de cabea, o programa A, naturalmente incluindo as chamadas sucessivas aossubprogramas. Anote a seqncia de impresso das letras. Voc um bom computador? Tem um bomprocessador? Tem uma boa memria? Quais letras sero impressas, e em qual seqncia? Como vocchegou a esse resultado? Pilha de ExecuoPara resolver esse problema o computador usa uma Pilha de Execuo. Essa pilha funciona assim: A cada comando Call, ou seja, a cada chamada de subprograma, o computador empilha (operao de</p><p>inserir um elemento na pilha) a posio do programa para a qual a execuo dever retornar depois deexecutar o subprograma que est sendo chamado;</p><p> A cada comando Return, ou seja, a cada vez que a execuo de um subprograma chega ao fim, ocomputador desempilha (operao que retira um elemento da pilha) a posio do programa para a quala execuo dever retornar, e passa a executar a partir desse endereo.</p><p> A chamada e execuo do programa A, e chamadas sucessivas aos subprogramas B, C e D, conformeapresentado na Tabela 3.1, resultar em uma Pilha de Execuo. A Tabela 3.2 apresenta essa Pilha deExecuo, comeando em uma situao 1, passando para a situao 2, situao 3, e assim por diante, ata situao final (20). </p><p>A3</p><p> C3A3</p><p>A3</p><p>A4</p><p> B2A4</p><p>C3B2A4</p><p> B2A4</p><p>A4situao</p><p>1:vazia</p><p>situao 2 situao 3 situao 4 situao</p><p>5:vazia</p><p>situao 6 situao 7 situao 8 situao 9 situao 10</p><p> B4A4</p><p>A4</p><p> B5A4</p><p>C3B5A4</p><p> B5A4</p><p>A4</p><p>A5</p><p>situao 11 situao 12 situao 13 situao 14 situao 15 situao 16 situao</p><p>17:vazia</p><p>situao 18 situao</p><p>19:vazia</p><p>situao</p><p>20:f im</p><p>Tabela 3.2 Seqncia de situaes da pilha de execuo</p></li><li><p>14/05/13 Unidade 3: Pilhas, Alocao Sequencial e Esttica</p><p>www2.dc.ufscar.br/~bsi/materiais/ed/u3.html 4/14</p><p> Vamos executar o Programa A?</p><p>Inicialmente a pilha est vazia. Executamos a linha A1, o que imprime a letra A. Passamos a executar a</p><p>linha A2 comando Call C. Nesse ponto temos que empilhar a posio do programa para a qual deveremosretornar (posio A3), e passar a executar o subprograma C. A pilha de execuo passa a situao 2. </p><p>Passamos a executar o subprograma C. Na linha C1 temos Print C, e ento imprimimos a letra C. Depois</p><p>temos na linha C2 o comando Call D. Nesse ponto empilhamos o endereo de retorno, C3, e passamos aexecutar o subprograma D. A pilha de execuo passa para a situao 3. Iniciamos a execuo do subprograma D. Linha D1: Print D (Imprime D); linha D2: Return. Quando</p><p>chegamos a um comando Return, desempilhamos da pilha de execuo, e passamos a executar a partirdesse endereo. O endereo desempilhado ser sempre o elemento do topo da pilha. No nosso caso, sero elemento C3. Passamos a executar a partir de C3, e a pilha passa para a situao 4. Executando a partir de C3, temos um novo comando Return. Desempilhamos novamente, agora o endereo</p><p>A3, e a pilha passa para a situao 5 (vazia novamente). No endereo A3 temos o comando Call B.Empilhamos A4, e passamos a executar o subprograma B. A pilha de execuo passa para a situao 6. Jno subprograma B temos Call C. Empilhamos B2 (situao 7) e passamos a executar C. Simulao 3.2: Pilha de ExecuoEst difcil entender essa execuo? Veja se fica mais fcil atravs da interao com a Simulao 3.2: Pilhade Execuo. </p><p>Em C temos Print C (imprime C) e Call D (situao 8). Em D, Print D (imprime D) e Return (situao 9).</p><p>Passamos a executar em C3 que outro comando Return (situao 10). </p><p>Passamos a executar em B2, que um comando Print B (imprime B), e a seguir temos Call D (empilha B4,</p><p>passa para a situao 11). Em D Print D (imprime D), Return, desempilha (situao 12) e vamos para B4.</p><p>Em B4 temos Call C (empilha B5, situao 13). Em C1 Print C (imprime C) e Call D (empilha C3, situao</p><p>14). Em D, Print D (imprime D), e Return (desempilha C3, situao 15), vamos para C3, que outro Return</p><p>(desempilha B5, situao 16). B5 outro Return, desempilha A4, situao 17, pilha vazia. Em A4 temos Call</p><p>D (empilha A5, situao 18). Executando D, temos Print D (imprime D), e Return (desempilha A5, situao</p><p>19, pilha vazia). Executando A5 temos outro comando Return, s que desta vez com a pilha vazia. Notemos como desempilhar de uma pilha vazia. Temos ento o final da execuo. As letras impressas, na seqncia, foram: A, C, D, C, D, B, D, C, D, D. Voc havia conseguido chegar a</p><p>esse resultado de cabea? </p><p>E o tal stack overflow, como ocorre? Aguarde um pouco mais e descobrir. </p><p>Para que serve uma pilha ento? Note, nesse exemplo, que a pilha de execuo serviu para armazenarelementos (endereos de retorno) em uma ordem especfica. Que ordem? Last In, First Out, ou seja, o ltimoelemento que entrou, ser o primeiro elemento a sair do conjunto. Funcionalidade de uma Pilha. Tipo Abstrato de Dados PilhaA partir do exemplo das chamadas de subprogramas, possvel identificar o uso de duas operaes:empilha e desempilha. A essas duas operaes, vamos acrescentar outras duas: operao para criar umapilha, e operao para testar se uma pilha est vazia. Vamos definir tambm os principais parmetros quedevem ser considerados nessas operaes (Tabela 3.3). </p><p>Operaes e Parmetros Funcionamento</p><p>Pilha.Empilha( QualPilha,QualElemento, DeuCerto? )</p><p>Empilha o elemento passado como parmetroQualElemento, na pilha passada no parmetroQualPilha. O parmetro DeuCerto? indica se aoperao foi bem sucedida ou no.</p></li><li><p>14/05/13 Unidade 3: Pilhas, Alocao Sequencial e Esttica</p><p>www2.dc.ufscar.br/~bsi/materiais/ed/u3.html 5/14</p><p>Pilha.Desempilha( QualPilha,QualElemento, DeuCerto? )</p><p>Desempilha (retira o elemento do topo) da pilhapassada no parmetro QualPilha, retornando o valordo elemento que foi desempilhado no parmetroQualElemento. O parmetro DeuCerto? indica se aoperao foi bem sucedida ou no.</p><p>Pilha.Vazia?( QualPilha ) Verifica se a pilha passada como parmetro(QualPilha) est ou no vazia (vazia = sem nenhumelemento).</p><p>Pilha.Cria( QualPilha ) Cria uma pilha, iniciando sua situao como vazia.Tabela 3.4 Funcionalidade de uma pilha</p><p> Lembra do conceito de Tipos Abstratos de Dados? Lembra para que serve esse conceito, na prtica? Servepara ser utilizado na fase de Projeto de um programa. Quando queremos armazenar um conjunto deelementos em um programa, primeiramente definimos os dados que sero armazenados e os operadoresque podem ser aplicados para manipulao desses dados. A partir da, nos demais mdulos do programa,vamos considerar esse conjunto de dados a serem armazenados dentro de uma caixa preta que s pode sermanipulada atravs dos operadores definidos. Esses operadores so como os botes para aumentar ovolume e para mudar os canais da TV, lembra dessa analogia? Exerccio 3.1 Transferir cartas de uma Pilha P1 para uma Pilha P2</p><p>Estamos na fase de Projeto do programa FreeCell. E no FreeCell temos uma pilha de cartas. A melhormaneira de considerar uma pilha de cartas, na fase de Projeto, como um Tipo Abstrato de Dados. Quaisdados devem ser armazenados? Cartas (como na Figura 3.5). Quais operaes podemos aplicar namanipulao desses dados? Os operadores de uma pilha, segundo definimos na Tabela 3.4: cria, vazia?,empilha e desempilha. </p><p>Imagem: Barbosa, Miyoshi, e Gomes, alunos da disciplina</p><p>Estruturas de Dados, UFSCar, 2008</p><p>Figura 3.5 Uma pilha de cartas </p><p>Elabore agora um algoritmo que transfere cartas de uma Pilha P1 para uma Pilha P2. Considere que aspilhas P1 e P2 j existem, ou seja, no precisam ser criadas. Para elaborar esse algoritmo, use osoperadores definidos na Tabela 3.4. Voc ter que elaborar esse algoritmo sem ter a menor idia de comoo Tipo Abstrato de Dados Pilha efetivamente implementado. Voc poder ver uma soluo para esse exerccio logo abaixo, mas no consulte essa soluo ainda. Tenteelaborar voc mesmo a soluo. assim que desenvolvemos nossa capacidade de solucionar problemas. </p><p> Algoritmo Transfere-Cartas-de-P1-para-P2 ( Parmetros por referncia P1 e P2 do tipo Pilha )/* transfere cartas da Pilha P1 para a Pilha P2, j existentes */ </p></li><li><p>14/05/13 Unidade 3: Pilhas, Alocao Sequencial e Esttica</p><p>www2.dc.ufscar.br/~bsi/materiais/ed/u3.html 6/14</p><p> fim do Algoritmo </p><p> Conseguiu propor uma soluo? Muito bom se conseguiu! Se no conseguiu, consulte a soluo abaixo, eprocure prestar bem a ateno em como o exerccio foi resolvido. </p><p> Algoritmo Transfere-Cartas-de-P1-para-P2 ( Parmetros por referncia P1 e P2 do tipo Pilha )/* transfere cartas da Pilha P1 para a Pilha P2, j existentes */ Varivel auxiliar Carta do tipo Elemento-da-PilhaVarivel auxiliar DeuCerto? tipo boolean Enquanto Pilha.Vazia( P1 ) = falso Faa Pilha.Desempilha( P1, Carta, DeuCerto? ) Pilha.Empilha( P2, Carta, DeuCerto? ) fim do Algoritmo </p><p> A traduo do algoritmo para o portugus: enquanto a pilha P1 no estiver vazia, retiramos um elemento dapilha P1 atravs da operao Pilha.Desempilha. O valor desempilhado de P1 retornar no parmetro Carta.A seguir empilhamos esse mesmo valor na pilha P2, acionando a operao Pilha.Empilha. Repetimos isso,atravs do comando Enquanto, at que a pilha P1 se torne vazia. Note que no temos ainda a menor ideia de como as operaes do TAD Pilha so efetivamenteimplementadas. Mas, manipulando a Pilha exclusivamente atravs das operaes, realmente no precisosaber detalhes de implementao. Consideramos a pilha de cartas como uma caixa preta, a qualmanipulamos apenas atravs dos operadores (ou botes da TV). assim que projetamos programasutilizando o conceito de Tipos Abstratos de Dados. Achou interessante? Alterar os dados de um cadastro sem ser por uma operao definida na especifiao do TAD possvel? possvel, mas fazendo isso estamos abrindo a TV com uma chave de fenda para aumentar o volume.Manipular uma pilha de cartas sem ser por operaes precisamente definidas na especificao do TADPilha possvel? possvel tambm. Estaremos aumentando o volume abrindo a TV com uma chave defenda, nesse caso tambm. </p><p>Vamos praticar um pouco mais a manipulao de uma pilha apenas atravs dos seus operadores?Proponha uma soluo. Se estiver difcil, forme um grupo de estudos, discuta com o grupo. Do grupo,provavelmente, sairo excelentes solues. Se ainda restarem dvidas, discuta com o seu tutor, professor edemais colegas em um frum criado exatamente para isso. </p><p> Exerccios Exerccio 3.2 Desenvolva um algoritmo para testar se uma pilha P1 tem mais elementos que uma pilhaP2. Considere que P1 e P2 j existem. Exerccio 3.3 D...</p></li></ul>