Estruturas de Dados I

download Estruturas de Dados I

of 156

Transcript of Estruturas de Dados I

  • 7/26/2019 Estruturas de Dados I

    1/156

    ESTRUTURA DEDADOS I

    Professor Me. Rogrio de Leon Pereira

    GRADUAO

    Unicesumar

  • 7/26/2019 Estruturas de Dados I

    2/156

  • 7/26/2019 Estruturas de Dados I

    3/156

    Viver e trabalhar em uma sociedade global umgrande desafio para todos os cidados. A buscapor tecnologia, informao, conhecimento dequalidade, novas habilidades para liderana e so-luo de problemas com eficincia tornou-se umaquesto de sobrevivncia no mundo do trabalho.

    Cada um de ns tem uma grande responsabilida-de: as escolhas que fizermos por ns e pelos nos-sos far grande diferena no futuro.

    Com essa viso, o Centro Universitrio Cesumar assume o compromisso de democratizar o conhe-cimento por meio de alta tecnologia e contribuirpara o futuro dos brasileiros.

    No cumprimento de sua misso promover aeducao de qualidade nas diferentes reas doconhecimento, formando profissionais cidadosque contribuam para o desenvolvimento de umasociedade justa e solidria , o Centro Universi-trio Cesumar busca a integrao do ensino-pes-

    quisa-extenso com as demandas institucionaise sociais; a realizao de uma prtica acadmicaque contribua para o desenvolvimento da consci-ncia social e poltica e, por fim, a democratizaodo conhecimento acadmico com a articulao ea integrao com a sociedade.

    Diante disso, o Centro Universitrio Cesumar al-meja ser reconhecida como uma instituio uni-versitria de referncia regional e nacional pela

    qualidade e compromisso do corpo docente;aquisio de competncias institucionais parao desenvolvimento de linhas de pesquisa; con-solidao da extenso universitria; qualidadeda oferta dos ensinos presencial e a distncia;bem-estar e satisfao da comunidade interna;qualidade da gesto acadmica e administrati-va; compromisso social de incluso; processos decooperao e parceria com o mundo do trabalho,como tambm pelo compromisso e relaciona-

    mento permanente com os egressos, incentivan-do a educao continuada.

  • 7/26/2019 Estruturas de Dados I

    4/156

  • 7/26/2019 Estruturas de Dados I

    5/156

    Seja bem-vindo(a), caro(a) acadmico(a)! Voc estiniciando um processo de transformao, pois quan-do investimos em nossa formao, seja ela pessoalou profissional, nos transformamos e, consequente-mente, transformamos tambm a sociedade na qualestamos inseridos. De que forma o fazemos? Criandooportunidades e/ou estabelecendo mudanas capa-zes de alcanar um nvel de desenvolvimento compa-tvel com os desafios que surgem no mundo contem-porneo.

    O Centro Universitrio Cesumar mediante o Ncleo deEducao a Distncia, o(a) acompanhar durante todo

    este processo, pois conforme Freire (1996): Os homens

    se educam juntos, na transformao do mundo.

    Os materiais produzidos oferecem linguagem dial-gica e encontram-se integrados proposta pedag-gica, contribuindo no processo educacional, comple-mentando sua formao profissional, desenvolvendocompetncias e habilidades, e aplicando conceitostericos em situao de realidade, de maneira a inse-ri-lo no mercado de trabalho. Ou seja, estes materiaistm como principal objetivo provocar uma aproxi-mao entre voc e o contedo, desta forma possi-bilita o desenvolvimento da autonomia em busca dosconhecimentos necessrios para a sua formao pes-soal e profissional.

    Portanto, nossa distncia nesse processo de cres-cimento e construo do conhecimento deve serapenas geogrfica. Utilize os diversos recursos peda-

    ggicos que o Centro Universitrio Cesumar lhe possi-bilita. Ou seja, acesse regularmente o AVA AmbienteVirtual de Aprendizagem, interaja nos fruns e en-quetes, assista s aulas ao vivo e participe das discus-ses. Alm disso, lembre-se que existe uma equipe deprofessores e tutores que se encontra disponvel parasanar suas dvidas e auxili-lo(a) em seu processo deaprendizagem, possibilitando-lhe trilhar com tranqui-lidade e segurana sua trajetria acadmica.

    Diretoria Operacionalde Ensino

    Diretoria dePlanejamento de Ensino

  • 7/26/2019 Estruturas de Dados I

    6/156

    Professor Me. Rogrio de Leon Pereira

    Possui graduao em Tecnologia em Processamento de Dados pelo Centrode Ensino Superior de Maring (1999) e mestrado em Cincia da Computao

    pela Universidade Estadual de Maring (2006). Atualmente analista de

    informtica da Universidade Estadual de Maring. Tem experincia na rea de

    Cincia da Computao, com nfase em desenvolvimento de sistemas Web.

    AUTOR

  • 7/26/2019 Estruturas de Dados I

    7/156

    SEJA BEMVINDOA!

    Recebi a proposta de elaborar o material que voc carrega em suas mos sobre Estru-tura de Dados, contedo de extrema importncia que liga o conhecimento obtido namatria de algoritmos com as disciplinas tcnicas de programao que voc ver at ofinal do seu curso.

    Quando falamos em Estrutura de Dados, estamos falando da forma como os dados soarmazenados e manipulados no computador. Falamos tambm das tcnicas para inclu-so, acesso, alterao e excluso destes dados.

    Na dcada de 1980, quando eu jogava videogame (ATARI 2600) com o meu irmo maisvelho, Ricardo, ele sempre dizia: Como que um monte de 1s e 0s pode ser to legal?.

    Essa pergunta me intrigou por muito tempo, mas a resposta voc encontrar neste li-vro. Como veremos nas pginas a seguir, de nada importa as sequncias de 1s e 0s queo computador carrega na memria, seja na primria ou na secundria, elas no tmsignificado algum se no forem determinadas regras de como essas informaes seroanalisadas.

    Na Unidade I, veremos os principais sistemas numricos utilizados na computao: deci-mal, binrio e hexadecimal, contedo j visto na disciplina de Fundamentos e Arquitetu-ras de Computadores. Seu entendimento de supraimportncia para o aprendizado docontedo deste livro. Tambm sero revistas as definies de variveis unidimensionaiscontidas na disciplina de Algoritmos e Lgica de Programao II e a forma como elas soestruturadas na memria do computador.

    Passando para a Unidade II, completaremos a reviso vendo as variveis multidimensio-nais. Com esse contedo aprendido, j veremos as duas primeiras estruturas: a Fila e aPilha.

    O prximo passo ser estudar o contedo considerado, por muitos, um dos mais difceisna rea de programao, que o conceito de Ponteiros.

    Em seguida, veremos a aplicao e o uso dos Ponteiros na criao de listas dinmicas,que uma alternativa muito interessante forma esttica criada com as variveis mul-

    tidimensionais.Para o encerramento do contedo, foi reservado na Unidade V um espao para falarsobre Grafos, uma estrutura muito utilizada em vrios nveis de programao, e tambmsobre algumas tcnicas para trabalhar com eles.

    Lembre-se que o curso de graduao criado seguindo um processo lgico e estru-turado de formao do conhecimento. Voc j aprendeu sobre os sistemas numricosna disciplina de Fundamentos e Arquitetura de Computadores e sobre variveis na deAlgoritmos e Lgica de Programao.

    O que veremos aqui, neste livro, uma sequncia desse contedo e a sua aplicao, que

    servir de base para as prximas disciplinas de cunho tcnico do seu curso e para a suaformao como profissional de Tecnologia da Informao.

    APRESENTAO

    ESTRUTURA DE DADOS I

  • 7/26/2019 Estruturas de Dados I

    8/156

  • 7/26/2019 Estruturas de Dados I

    9/156

    SUMRIO

    UNIDADE I

    SISTEMAS NUMRICOS E ALOCAO DE MEMRIA

    15 Introduo

    16 Sistema Decimal

    19 Sistema Binrio

    21 Representao de Decimal em Binrio

    23 Sistema Hexadecimal

    26 Estrutura de Dados

    28 Tipos De Variveis E Alocao Na Memria

    29 Nmeros Inteiros

    31 Nmeros Reais

    33 Consideraes Finais

    UNIDADE II

    PILHAS E FILAS

    39 Introduo

    39 Estruturas Homogneas e Heterogneas

    40 Vetores e Matrizes

    41 Registros

    42 Pilhas

    53 Filas

    62 Consideraes Finais

  • 7/26/2019 Estruturas de Dados I

    10/156

    SUMRIO

    UNIDADE III

    PONTEIROS

    69 Introduo

    69 Ponteiros

    76 Propriedades de Ponteiros

    77 Alocao Dinmica na Memria

    82 Criando Vetores Dinmicos

    84 Consideraes Finais

    UNIDADE IV

    LISTAS DINMICAS

    91 Introduo

    91 Fundamentos de Listas Dinmicas

    94 Implementando uma Lista Dinmica

    101 Lista Dinmica com Forma de Pilha

    104 Lista Dinmica com Forma de Fila

    108 Consideraes Finais

  • 7/26/2019 Estruturas de Dados I

    11/156

    SUMRIO

    UNIDADE V

    GRAFOS

    113 Introduo

    113 Sete Pontes de Knigsberg

    116 Teoria dos Grafos

    117 Grafos como Representao de Problemas

    118 Representao Computacional de Grafos

    122 Implementando Grafos em C

    129 Consideraes Finais

    131 CONCLUSO

    133 REFERNCIAS

    135 GABARITO155 ANEXO

  • 7/26/2019 Estruturas de Dados I

    12/156

  • 7/26/2019 Estruturas de Dados I

    13/156

    UN

    IDADE

    I

    Professor Me. Rogrio de Leon Pereira

    SISTEMAS NUMRICOS E

    ALOCAO DE MEMRIA

    Objetivos de Aprendizagem

    Conhecer os principais sistemas numricos utilizados nacomputao: decimal, binrio e hexadecimal.

    Aprender a relao e a converso de valores entre diferentes sistemasnumricos.

    Conhecer os principais tipos de variveis.

    Entender como os dados das variveis so armazenados na memria.

    Plano de Estudo

    A seguir, apresentam-se os tpicos que voc estudar nesta unidade:

    Sistema decimal

    Sistema binrio

    Representao de decimal em binrio

    Sistema hexadecimal

    Estrutura de dados

    Tipos de variveis e alocao na memria

    Nmeros inteiros

    Nmeros reais

  • 7/26/2019 Estruturas de Dados I

    14/156

  • 7/26/2019 Estruturas de Dados I

    15/156

    INTRODUO

    Nmeros so sequncias ordenadas de algarismos que tm seu valor determi-

    nado pela posio de seus elementos e de sua base numrica.Parece complicado, mas no . Estamos acostumados a trabalhar em ape-

    nas uma base numrica, a Decimal. Nesta unidade veremos mais a fundo como

    funcionam diferentes sistemas numricos como o Binrio, o Hexadecimal e suas

    aplicaes.

    Compreendendo melhor os sistemas numricos, passaremos a estudar como

    os dados so armazenados na memria. Isso importante para entender como

    funcionam as estruturas de dados mais simples, que so as variveis.As informaes esto armazenadas na memria do computador, mas para

    decifr-las preciso saber qual a sua estrutura. Um grupo de bits pode ser inter-

    pretado de diversas maneiras diferentes. como ler um livro em outro idioma

    sem o respectivo dicionrio. Voc at reconhece as letras, mas no sabe qual

    grupo forma qual vocbulo, qual o seu som e significado.

    Parte desse contedo no novidade, j foi visto na disciplina de Fundamentos

    e Arquitetura de Computadores e na de Algoritmos e Lgica de Programao

    II. E voc no ir parar por a, porque o que aprendermos agora ser utilizadomais frente no seu curso em outras disciplinas correlatas.

    shutterstock

    Introduo

    Reproduo

    proibida.

    Art.

    184doC

    digoPenaleLei9

    .610de19defevereiro

    de199

    8.

  • 7/26/2019 Estruturas de Dados I

    16/156

    SISTEMA DECIMAL

    Voc pode at no ter ouvido falar do Sistema de Numerao de Base 10, ou

    Sistema Decimal, mas com certeza o conhece h muito tempo, pois nesse sis-

    tema que aprendemos a contar os nmeros e realizar as mais bsicas operaes

    algbricas: adio, subtrao, multiplicao e diviso.

    Os algarismos no sistema decimal podem assumir apenas dez valores, do 0

    ao 9, da a origem de seu nome. Da mesma forma, dito que um sistema debase dez, pois todos os seus nmeros so formados por algarismos que podem

    assumir apenas dez valores distintos.

    A representao formal de um nmero pode ser dada da seguinte forma:

    N = (An-1

    ...Ap+2

    Ap+1

    Ap)

    B

    Onde:N = o nmero a ser formado;

    A = so os algarismos que compem o nmero N;p = posio do algarismoAno nmero N, iniciando-se emp = 0na pri-meira posio direita indo atp = n - 1, onde n o nmero de algarismosque compem o nmero;

    B = a base do nmero N, que no caso do sistema decimal 10.

    O elementoA uma varivel e pode assumir diversos valores dentro do

    conjunto CDdos algarismos que compem os nmeros decimais, que pode ser

    representado na seguinte forma:

    shutterstock

    SISTEMAS NUMRICOS E ALOCAO DE MEMRIA

    Reproduo

    proibida.Art.184do

    CdigoPenaleL

    ei9.610de19defevereiro

    de1998.

    I

  • 7/26/2019 Estruturas de Dados I

    17/156

    shutterstock

    Sistema Decimal

    Reproduo

    proibida.

    Art.

    184doC

    digoPenaleLei9

    .610de19defevereiro

    de199

    8.

    CD = (0,1,2,3,4,5,6,7,8,9)

    O valor de cada um dos algarismos tem a sua relevn-

    cia dada pela posio que ocupa no nmero. Como estamos

    trabalhando no sistema decimal, cada componente ser mul-

    tiplicado por uma potncia de base 10 com expoente relativo

    a sua posio no nmero.

    N=A*10n-1+...+A*10

    p+2+A*10p+1+A*10

    p

    Assim, podemos dizer que um nmero no sistema deci-

    mal o somatrio da multiplicao dos seus elementos poruma potncia de base 10 elevada ao ndice da sua posio

    de relevncia.

    Por questes acadmicas, faz-se necessrio o uso da notao

    formal. Porm, por se tratar de um material especialmente

    preparado para o uso em autoestudo, preciso que tal infor-mao seja abstrada para uma linguagem mais coloquial. A

    melhor forma de realizar isso por meio de exemplos.

    Exemplo 1: calcule o valor do nmero 12345 na base

    decimal.

    Sabemos que a representao numrica de N dada pelo

    nmero 12345, ou seja:

    N = 12345Como j foi dito, o valor dele dever ser calculado no

    sistema de base 10 (decimal). Assim:

    N = (12345)10

    Pela definio apresentada, o valor de N o somatrio

    da multiplicao de seus elementos pela potncia de base

    10 elevada ao expoentep, ondep a posio do algarismo

    no nmero, contando-se da direita para a esquerda inician-

    do-se com 0.N = 1*10

    4 + 2*103 + 3*10

    2 + 4*101 + 5*10

    0

  • 7/26/2019 Estruturas de Dados I

    18/156SISTEMAS NUMRICOS E ALOCAO DE MEMRIA

    Reproduo

    proibida.Art.184do

    CdigoPenaleL

    ei9.610de19defevereiro

    de1998.

    I

    Calculando as potncias, temos:

    N = 1*10000 + 2*1000 + 3*100 + 4*10 + 5*1

    Realizando as multiplicaes:

    N = 10000 + 2000 + 300 + 40 + 5

    E, por ltimo, a soma dos elementos j calculados:

    N=12345

    Exemplo 2: calcule o valor do nmero 54321 na base decimal.N = 54321

    N = (54321)10N = 5*10

    4 + 4*103 + 3*10

    2 + 2*101 + 1*10

    0

    N = 5*10000 + 4*1000 + 3*100 + 2*10 + 1*1

    N = 50000+4000+300+20+1

    N = 54321

    Exemplo 3: calcule o valor do nmero 42 na base decimal.N = 42

    N = (42)10N = 4*10

    1+2*100

    N = 4*10+2*1

    N = 40+2

    N=42

    Parece bvio dizer que o nmero 42 na base decimal equivale a 42, mas isso

    se d porque estamos trabalhando com um sistema numrico que j utilizadodiversas vezes durante o dia. O importante saber como realizado o clculo

    de um nmero de forma posicional, o que ser til para entender o funciona-

    mento em sistemas que no utilizam a base 10.

    Dois nmeros em bases diferentes podem ter valores distintos mesmo pos-suindo os mesmos algarismos nas mesmas posies.

  • 7/26/2019 Estruturas de Dados I

    19/156

    shutterstock

    Sistema Binrio

    Reproduo

    proibida.

    Art.

    184doC

    digoPenaleLei9

    .610de19defevereiro

    de199

    8.

    SISTEMA BINRIO

    Esse com certeza voc j deve ter ouvido falar. Ele utiliza apenas dois valores, 0

    e 1, e amplamente utilizado tanto para o armazenamento fsico das informa-

    es quanto para os clculos realizados dentro do ncleo do processador. No

    importa o que voc est vendo nesse exato momento: figuras, desenhos, letras

    ou nmeros decimais, at mesmo ouvindo uma msica no computador, celular

    ou MP3player. Internamente tudo representado por uma sequncia de alga-rismos 0 e 1.

    Voltando notao formal j utilizada na representao do sistema deci-

    mal, vamos aplic-la agora para entender melhor a composio de um nmero

    no sistema binrio.

    N = (An-1

    ...Ap+2

    Ap+1

    Ap)

    B

    Diferente do sistema decimal que possua base 10, o sistema binrio possui

    apenas dois valores (base 2). Assim o conjunto CDde elementos que represen-

    tam os possveis valores do algarismoA:CD = (0,1)

  • 7/26/2019 Estruturas de Dados I

    20/156SISTEMAS NUMRICOS E ALOCAO DE MEMRIA

    Reproduo

    proibida.Art.184do

    CdigoPenaleL

    ei9.610de19defevereiro

    de1998.

    I

    Como j apresentado anteriormente, o valor de cada um dos algarismos tem

    a sua relevncia dada pela posio que ocupa no nmero. No caso do sistema

    binrio, cada componente ser multiplicado por uma potncia de base 2 com

    expoente relativo a sua posio no nmero.

    N = A*2n-1 +...+ A*2

    p+2 + A*2p+1 + A*2

    p

    Novamente, podemos dizer que o valor de um nmero o somatrio da mul-

    tiplicao dos seus elementos por uma potncia de base Belevada ao ndice da

    sua posio de relevncia. No caso do sistema binrio, o valor de B = 2(base 2):

    Note que a forma de encontrar o valor de um nmero no sistema binrio similar

    utilizada para encontrar o valor de um nmero no sistema decimal, diferen-

    ciando-se apenas pelo valor da base Be do conjunto CDde possveis valores do

    elementoA.

    Vamos ver agora alguns exemplos de como calcular o valor de um nmero

    representado no sistema binrio.Exemplo 1: calcule o valor decimal do nmero 101010 na base binria.

    Sabemos que a representao numrica de N dada pelo nmero 101010,

    ou seja:

    N=101010

    Como j foi dito, o valor dele dever ser calculado no sistema de base 2

    (binrio). Assim:

    N=(101010)2Pela definio apresentada, o valor de N o somatrio da multiplicao de

    seus elementos pela potncia de base 2 elevada ao expoentep, ondep a posio

    do algarismo no nmero, contando-se da direita para a esquerda, iniciando-se

    com 0.N = 1*2

    5 + 0*24 + 1*2

    3 + 0*22 + 1*2

    1 + 0*20

    Calculando as potncias, temos:

    N = 1*32+0*16+1*8+0*4+1*2+0*1

  • 7/26/2019 Estruturas de Dados I

    21/156

    Representao de Decimal em Binrio

    Reproduo

    proibida.

    Art.

    184doC

    digoPenaleLei9

    .610de19defevereiro

    de199

    8.

    Realizando as multiplicaes:

    N = 32+8+2

    E, por ltimo, a soma dos elementos j calculados:N=42

    Exemplo 2: calcule o valor decimal do nmero 1101 na base binria.N= 1101

    N= (1101)2

    N= 1*23 + 1*2

    2 + 0*21 + 1*2

    0

    N= 1*8 + 1*4 + 0*2 + 1*1

    N=8+4+1

    N=13

    REPRESENTAO DE DECIMAL EM BINRIO

    No sistema decimal, a quantidade de nmeros inteiros nicos possveis se d

    pela forma 10n, onde n a quantidade de algarismos presentes no nmero. Dessa

    forma, um nmero decimal com apenas um algarismo pode formar 101nmeros:

    101 = (0,1,2,3,4,5,6,7,8,9)

    Um nmero decimal com dois algarismos forma 102 combinaes possveis,

    ou seja, 100 nmeros:

    102 = (00,01,02,03,...,97,98,99)

    Analogamente, a quantidade de nmeros formados no sistema binrio sed pela frmula Bn, onde n a quantidade de smbolos (algarismos) no nmero

    Um nmero binrio que termina com 1 ser sempre um valor decimal mpar,j que a primeira posio direita equivale a 0= 1, e como todas as demaispotncias de 2 so nmeros pares, qualquer nmero par acrescido de 1 serum nmero mpar.

  • 7/26/2019 Estruturas de Dados I

    22/156SISTEMAS NUMRICOS E ALOCAO DE MEMRIA

    Reproduo

    proibida.Art.184do

    CdigoPenaleL

    ei9.610de19defevereiro

    de1998.

    I

    e B a base do sistema, que no caso do binrio B = 2(base 2). Desse modo, um

    nmero binrio com dois algarismos formar quatro valores:

    22=(00,01,10,11)

    Assim, caso seja necessrio representar todos os valores de um nmero deci-

    mal inteiro positivo de apenas um dgito (101), seriam necessrios pelo menos

    4 dgitos binrios (24), conforme a tabela abaixo:

    DECIMAL BINRIO

    0 0000

    1 0001

    2 0010

    3 0011

    4 0100

    5 0101

    6 0110

    7 0111

    8 1000

    9 1001

    Fonte: o autor

    Note que a quantidade de combinaes possveis para um nmero com 4 dgitos

    binrios so 16, porm, apenas 10 so necessrios para a representao de um

    algarismo decimal. Os nmeros 1010, 1011, 1100, 1101, 1110 e 1111 acabam nosendo utilizados. importante entender que uma mesma combinao de valo-

    res pode ter diversos significados diferentes, de acordo com as regras utilizadas

    para a sua interpretao. Isso ficar mais claro quando abordarmos o conceito

    de variveis ainda nesta unidade.

  • 7/26/2019 Estruturas de Dados I

    23/156

    shutterstock

    Sistema Hexadecimal

    Reproduo

    proibida.

    Art.

    184doC

    digoPenaleLei9

    .610de19defevereiro

    de199

    8.

    SISTEMA HEXADECIMAL

    O sistema de base 16 o ltimo que veremos dentro da disciplina de estrutura

    de dados. Ele tambm muito utilizado na computao para a representao

    numrica. Por ser um sistema de base 16, os nmeros hexadecimais so compos-

    tos por algarismos que podem assumir 16 valores diferentes, conforme exposto

    no conjunto CDabaixo:

    CD = (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)Onde a letraArepresenta o valor 10, a letra Bo valor 11, a letra Co valor

    12, e assim por diante, at a letra F, que representa o valor 15.

    O sistema hexadecimal muito utilizado porque considerado um interme-

    dirio entre aquilo que estamos habituados a ver (nmeros decimais) e aquilo

    com o que o computador trabalha internamente em nvel de hardware (nme-

    ros binrios). Outra justificativa se d pela possibilidade de representar todos

    os smbolos hexadecimais em um nmero binrio de 4 dgitos, diferente do queacontece quando tentamos representar um dgito decimal em binrio.

    DECIMAL BINRIO HEXADECIMAL

    0 0000 0

    1 0001 1

    2 0010 2

    3 0011 3

    4 0100 4

  • 7/26/2019 Estruturas de Dados I

    24/156SISTEMAS NUMRICOS E ALOCAO DE MEMRIA

    Reproduo

    proibida.Art.184do

    CdigoPenaleL

    ei9.610de19defevereiro

    de1998.

    I

    DECIMAL BINRIO HEXADECIMAL

    5 0101 5

    6 0110 6

    7 0111 7

    8 1000 8

    9 1001 9

    10 1010 A

    11 1011 B

    12 1100 C

    13 1101 D

    14 1110 E

    15 1111 F

    Fonte: o autor

    Para saber o valor de um nmero hexadecimal, basta converter cada um dos alga-

    rismos de base 16 para base 2 e o resultado final em base 10. Vamos ver agoraalguns exemplos de como calcular o valor de um nmero representado no sis-

    tema hexadecimal.

    Exemplo 1: calcule o valor decimal do nmero F2 na base hexadecimal.

    Isolando cada um dos algarismos, podemos formar a seguinte tabela:

    HEXADECIMAL DECIMAL BINRIO

    F 15 1111

    2 2 0010

  • 7/26/2019 Estruturas de Dados I

    25/156

    Sistema Hexadecimal

    Reproduo

    proibida.

    Art.

    184doC

    digoPenaleLei9

    .610de19defevereiro

    de199

    8.

    Agrupando agora os valores binrios dos dgitos hexadecimais, temos:

    N=(11110010)2O valor de N o somatrio da multiplicao de seus elementos pela potn-

    cia de base 2 elevada ao expoentep, ondep a posio do algarismo no nmero,

    contando-se da direita para a esquerda, iniciando-se com 0.

    N = 1*27 + 1*2

    6 + 1*25 + 1*2

    4 + 0*23 + 0*2

    2 + 1*21 + 0*2

    0

    Calculando as potncias, temos:

    N = 1*128 + 1*64 + 1*32 + 1*16 + 0*8 + 0*4 + 1*2 + 0*1

    Realizando as multiplicaes:N = 128 + 64 + 32 + 16 + 2

    E, por ltimo, a soma dos elementos j calculados:

    N = 242

    Exemplo 2: calcule o valor decimal do nmero 1A na base hexadecimal.

    HEXADECIMAL DECIMAL BINRIO

    1 1 0001

    A 10 1010

    N= (00011010)2

    N= 0*27+0*2

    6+0*25+1*2

    4+1*23+0*2

    2+1*21+0*2

    0

    N= 0*128 + 0*64 + 0*32 + 1*16 + 1*8 + 0*4 + 1*2 + 0*1

    N= 16+8+2

    N= 26

  • 7/26/2019 Estruturas de Dados I

    26/156

    shutterstock

    SISTEMAS NUMRICOS E ALOCAO DE MEMRIA

    Reproduo

    proibida.Art.184do

    CdigoPenaleL

    ei9.610de19defevereiro

    de1998.

    I

    ESTRUTURA DE DADOS

    Digamos que voc est acessando a memria do com-

    putador e encontra um agrupamento de 24 bits

    na seguinte configurao:

    0011 1011 0010 1101 0010 1001

    O que significa essa string binria

    (sequncia de 1s e 0s)? A resposta correta

    : qual a estrutura do dado?Voc pode ter se perguntado por que fizemos

    uma reviso sobre os sistemas numricos e outros conceitos j vistos em

    disciplinas anteriores. Tambm ficou curioso(a) em saber o que a to falada

    estrutura de dados que at agora no ficou claro. Prepare-se, pois em alguns

    minutos voc dir: agora as coisas comeam a fazer sentido.

    Ns temos essa stringbinria, mas no sabemos como a sua estrutura,

    ento, esse mesmo dado pode ser lido de inmeras maneiras diferentes. Vamos

    considerar que cada conjunto de 8 bits representa um valor decimal.

    0011 1011 0010 1101 0010 1001

    N1

    N2

    N3

    Assim, para o primeiro grupo N1:

    N1= (0011 1011)

    2

    N1= 0*27

    + 0*26

    + 1*25

    + 1*24

    + 1*23

    + 0*22

    + 1*21

    + 1*20

    N1= 0*128 + 0*64 + 1*32 + 1*16 + 1*8 + 0*4 + 1*2 + 1*1

    N1= 32+16+8+2+1

    N1= 59

    Para o prximo grupo de 8 bits, N2:

    N2= (0010 1101)

    2

    N2= 0*2

    7+0*26+1*2

    5+0*24+1*2

    3+1*22+0*2

    1+1*20

    N2=0*128+0*64+1*32+0*16+1*8+1*4+0*2+1*1

    N2= 32+8+4+1N

    2= 45

  • 7/26/2019 Estruturas de Dados I

    27/156

    Estrutura de Dados

    Reproduo

    proibida.

    Art.

    184doC

    digoPenaleLei9

    .610de19defevereiro

    de199

    8.

    E finalmente, para os ltimos 8 bits, N3:

    N3= (0010 1001)2N

    3= 0*2

    7+0*26+1*2

    5+0*24+1*2

    3+0*22+0*2

    1+1*20

    N3= 0*128+0*64+1*32+0*16+1*8+0*4+0*2+1*1

    N3= 32+8+1

    N3= 41

    Ento, se interpretssemos a stringde bits 0011 1011 0010 1101 0010 1001

    como trs agrupamentos de 8 bits, o resultado seria a sequncia de nmeros: 59,

    45 e 41. Note que a sequncia de nmeros apresentados diferente do nmerodecimal 594541.

    Porm, como no sabemos qual a estrutura do dado, podemos ler a mesma

    stringde outras formas. E se cada grupo de 4 bits representar um nmero hexade-

    cimal? Qual seria o resultado? Vamos usar uma tabela para facilitar a converso:

    BINRIO 0011 1011 0010 1101 0010 1001

    DECIMAL 3 11 2 13 2 9

    HEXADECIMAL 3 B 2 D 2 9

    Temos que a stringde bits 0011 1011 0010 1101 0010 1001 em hexadecimal equi-

    vale a 3B2D29, usando a regra de que cada 4 bits formam 1 caractere de base 16.

    Eu sei que cada dois caracteres hexadecimais podem formar 162combinaes

    possveis, ou seja, 256 nmeros, que a quantidade de caracteres existentes na

    Tabela ASC II e sua extenso. Digamos ento que eu deseje olhar na tabela e ver

    qual o caractere para cada grupo de dois dgitos em base 16. O resultado seria:

    HEXADECIMAL 3B 2D 29

    TABELA ASC II ; - )

    Vamos analisar agora todas as formas que encontramos para interpretar o mesmo

    valor. Lembre-se que como no sabemos como o dado foi estruturado na mem-

    ria, existem ainda outras possibilidades de anlise.

  • 7/26/2019 Estruturas de Dados I

    28/156

    shutterstock

    SISTEMAS NUMRICOS E ALOCAO DE MEMRIA

    Reproduo

    proibida.Art.184do

    CdigoPenaleL

    ei9.610de19defevereiro

    de1998.

    I

    Binrio 0011 1011 0010 1101 0010 1001

    Decimal, em grupo de 8 bits 59 45 41

    Hexadecimal, em grupo de 4 bits 3B 2D 29

    Hexadecimal, convertido pela tabela ASC II ;-)

    Agora ficou claro que no basta apenas ler a memria, preciso saber como as

    informaes armazenadas foram estruturadas para ento fazer a correta inter-

    pretao de seus valores.

    Voc encontrar a Tabela ASC II e a sua extenso no final deste livro.

    TIPOS DE VARIVEIS E ALOCAO NA MEMRIA

    Para esta disciplina, escolhemos a Linguagem C, que foi a mesma adotada na

    disciplina de Algoritmos e Lgica de Programao II. Dessa forma, esperamos

    que o aluno possa entrar direto no entendimento do contedo sem muita neces-

    sidade de estudo aprofundado da sintaxe.O C uma linguagem de tipagem forte, ou

    seja, todas as variveis precisam ter um tipo

    definido. Outras linguagens como o Clipper

    e o PHP possuem tipagem fraca, as variveis

    so criadas sem definio e podem assumir

    qualquer valor.

    Existem 7 tipos de variveis na linguagem

    C e eles ainda permitem o uso de modificadores comosigned, unsigned, short, longetc. Quando falamos em tipo,

    O nmero representado por 11 pode possuir diferentes significados. Se forna base hexadecimal, o nmero 11 equivale a 17 decimal. Se for na basebinria, o nmero 11 representa o 3 decimal.

  • 7/26/2019 Estruturas de Dados I

    29/156

    Nmeros Inteiros

    Reproduo

    proibida.

    Art.

    184doC

    digoPenaleLei9

    .610de19defevereiro

    de199

    8.

    falamos da estrutura da varivel. o conjunto de regras que determina como ela

    deve ser lida e como as operaes matemticas so realizadas.

    Observe o seguinte trecho de cdigo:

    1

    2

    3

    4

    5

    6

    7

    89

    10

    11

    12

    13

    14

    15

    16

    17

    #include

    #include

    int i, j, k;

    oat l, m, n;

    int main() {

    i = 1;j = 2;

    k = i + j;

    l = 1;

    m = 2;

    n = l + m;

    printf( k = %d\n n = %f\n, k, n);

    system(pause);

    return(0);

    }

    Tanto o valor da varivel kquanto o valor da varivel nso obtidos por meio

    da atribuio de uma soma de duas outras variveis. Apesar de ambos os casos

    utilizarem o mesmo smbolo de operao (+), a forma como o clculo reali-

    zado internamente diferente. O compilador sabe que a estrutura de nmeros

    inteiros diferente da estrutura de nmeros reais e que para cada caso a mesma

    operao (adio) precisa ser realizada de acordo com as regras definidas pelo

    tipo da varivel.

    NMEROS INTEIROS

    Um nmero inteiro positivo utiliza todos os bits para compor seu valor. Assim,

    um nmero com n bits tem 2nvalores possveis. Para ficar mais fcil o entendi-mento, vamos imaginar um nmero inteiro positivo com 8 bits (n = 8). Aplicando

  • 7/26/2019 Estruturas de Dados I

    30/156SISTEMAS NUMRICOS E ALOCAO DE MEMRIA

    Reproduo

    proibida.Art.184do

    CdigoPenaleL

    ei9.610de19defevereiro

    de1998.

    I

    a regra de 2ncom n = 8, temos:

    28= 256

    Ento o intervalo de nmeros inteiros positivos vlidos com 8 bits vai de 0

    (0000 0000) a 255 (1111 1111).

    Segundo Tenenbaum (1995), existem vrias formas de representar nmeros

    inteiros negativos. As duas principais so o Complemento de 1 e o Complemento

    de 2.

    No Complemento de 1, o primeiro bit a partir da esquerda (a maior potncia

    de 2) reservado como identificador de sinal no nmero. Para um inteiro com nbits, os n - 1 bits restantes so usados para a representao de valor. Uma sequncia

    de bits comeando por 0 representa um nmero positivo e uma sequncia de

    bits comeando por 1 representa um valor negativo. O nmero negativo obtido

    invertendo o valor de todos os bits.

    Exemplo: O nmero 42 representado por:

    0 0 1 0 1 0 1 0

    Para encontrar o seu valor negativo (-42) usando o modo Complemento de 1basta inverter o valor de todos os seus bits:

    1 1 0 1 0 1 0 1

    As possveis representaes de nmeros vo de -(2n-1 - 1) a +(2n-1 - 1). Em um

    nmero inteiro com 8 bits, os valores variam de -127 a +127. Essa notao per-

    mite a existncia de duas representaes para o nmero 0. O zero positivo 0000

    0000 e o zero negativo 1111 1111.Na notao Complemento de 2, o valor 1 somado na notao Complemento

    de 1 de um nmero negativo. Por exemplo, o nmero 42 representado por 0010

    1010 e o seu Complemento de 1 encontrado invertendo o valor de todos os

    bits ficando 1101 0101, representando -42. Na notao Complemento de 2 basta

    somar 1 ao nmero negativo encontrado no Complemento de 1, que 1101 0110.

    Nessa notao, as possveis representaes variam de -(2n-1) a +(2n-1 - 1).

    Pensando em um nmero inteiro de 8 bits, os valores variam de -128 a +127.

    Isso acontece porque h apenas uma nica representao para o nmero 0, que 0000 0000. Achando o Complemento de 1 do nmero 0 encontramos 1111

  • 7/26/2019 Estruturas de Dados I

    31/156

    Nmeros Reais

    Reproduo

    proibida.

    Art.

    184doC

    digoPenaleLei9

    .610de19defevereiro

    de199

    8.

    1111 e somando-se 1 a esse valor obtemos 1 0000 0000. Como o resultado tem

    9 bits, o nono bit descartado ficando apenas 0000 0000.

    NMEROS REAIS

    O conjunto dos nmeros reais formado por nmeros com casas decimais alm

    dos j conhecidos nmeros inteiros. Assim, todo nmero inteiro um nmero

    real, mas nem todo nmero real um nmero inteiro. O 42 um nmero inteiro

    e tambm um nmero pertencente ao conjunto dos nmeros reais. O nmero4,2 um nmero real, mas no inteiro.

    Se em um programa for necessrio controlar a quantidade de produtos em

    estoque e os produtos no so fracionados, usa-se um nmero inteiro. Para guar-

    dar o preo do produto, indicado um nmero real, j que alguns preos podem

    ser quebrados com complemento em centavos de reais.

    Na computao, a forma mais utilizada para a representao de nmeros

    reais a notao de ponto flutuante. Segundo Tenenbaum (1995), existem vriostipos de notao de ponto flutuante, cada qual com caractersticas prprias. O

    conceito que a representao de um nmero real se d por um nmero, cha-

    mado mantissa(M), multiplicado por uma base(B) elevada a uma potncia

    com expoente (E) inteiro.

    M *BE

    Vamos considerar, por exemplo, o nmero real 123,45 e que para represen-

    t-lo como ponto flutuante a base seja fixada em 10 (B=10). A notao ficaria:

    12345 *10-2

    Como 10-2= 0,01, ento 12345 *0,01 = 123,45. Note que o nmero (mantissa)

    Quando o primeiro bit da esquerda de uma varivel numrica for 1, significaque o nmero negativo desde que a varivel suporte valores menores doque zero (signed).

  • 7/26/2019 Estruturas de Dados I

    32/156SISTEMAS NUMRICOS E ALOCAO DE MEMRIA

    Reproduo

    proibida.Art.184do

    CdigoPenaleL

    ei9.610de19defevereiro

    de1998.

    I

    fixo e que a casa decimal (vrgula) flutua no nmero uma quantidade de alga-

    rismos definida pela potncia formada pela base elevada ao expoente.

    A notao de ponto flutuante pode variar de acordo com a arquitetura do

    hardware ou das regras definidas pelo compilador. O nmero 1000, por exemplo,

    pode ser escrito como 1000*100, 100 *10

    1, 10*102 ou 1*10

    3. O mais usualmente

    utilizado para representar um nmero real uma stringde 32 bits, sendo os pri-

    meiros 24 bits reservados para a mantissa e os ltimos 8 para o expoente, com

    a base fixa em 10.

    A representao em binrio de 24 bits do nmero decimal inteiro 12345 0000 0000 0011 0000 0011 1001, e a representao em complemento de 2 em 8

    bits de -2 1111 1110. Seguindo esses conceitos, a representao de 123,45 se

    d pela seguinte stringde 32 bits:

    0000 0000 0011 0000 0011 1001 1111 1110

    Vejamos alguns exemplos de nmeros em notao de ponto flutuante:

    10 0000 0000 0000 0000 0000 1010 0000 0000

    100 0000 0000 0000 0000 0110 0100 0000 00001000 0000 0000 0000 0011 1110 1000 0000 0000

    0,001 0000 0000 0000 0000 0000 0001 1111 1101

    10421,12 0000 1111 1110 0110 1100 0000 1111 1110

    A vantagem da notao de ponto flutuante que ela permite a representao

    de valores absolutos muito grandes ou muito pequenos. Na notao descrita

    nesta unidade, o maior nmero que pode ser representado 223-1

    *10127

    , que um nmero muito grande, e o menor 10-128, que um nmero muito pequeno.

    O limitante com o qual os nmeros podem ser escritos est diretamente rela-

    cionado quantidade de bits significativos na mantissa. Nem todo nmero entre

    o intervalo do menor e do maior podem ser representados. No formato aqui

    utilizado, 24 bits so reservados para a mantissa, sendo o primeiro usado para

    identificar se ele positivo ou negativo, restando apenas 23 bits significativos.

    Dessa forma, o nmero 10 milhes e 1 (que exige 24 dgitos binrios significa-

    tivos na mantissa) precisa ser aproximado para 10 milhes, (1*107) que exigeapenas um nico dgito de significncia.

  • 7/26/2019 Estruturas de Dados I

    33/156

    shutterstock

    Consideraes Finais

    Reproduo

    proibida.

    Art.

    184doC

    digoPenaleLei9

    .610de19defevereiro

    de199

    8.

    CONSIDERAES FINAIS

    A grande maioria dos profissionais que trabalham com computador tem uma

    viso de alto nvel do que acontece, ou seja, veem e interagem apenas com o

    resultado do processo, sem ter acesso e conhecimento de como ele se desenvolve.

    Nesta unidade, voc teve a oportunidade de observar melhor como as coi-

    sas acontecem em baixo nvel, no nvel em que o computador trabalha. Agora

    quando voc for criar um programa e definir uma varivel, voc com certeza ir

    lembrar que ela no s um espao reservado na memria, ela uma estruturaque define como aquelas informaes sero lidas e trabalhadas.

    Para poder trabalhar com estruturas de dados mais complexos, precisamos

    primeiramente ver as estruturas mais simples, e para isso necessrio saber como

    as informaes so representadas nos principais sistemas numricos. Esse foi o

    objetivo desta unidade.

    Na prxima unidade comearemos fazendo um pequeno resumo sobre vari-

    veis para armazenamento de valores mltiplos que so os vetores, matrizes eregistros. Em seguida, aplicaremos o que foi visto at o momento e apresentare-

    mos duas das mais simples e mais importantes estrutura de dados: pilhas e filas.

    ....

    .

  • 7/26/2019 Estruturas de Dados I

    34/156

    1. Uma stringde 8 bits pode conter diversos tipos de dados diferentes. Conside-rando que as stringsa seguir possuam um valor decimal inteiro positivo ou doisnmeros em hexadecimal de 4 bits cada, efetue a converso conforme o exem-plo da letra a:

    a) 1010 1010

    Para encontrar o valor em decimal de uma sequncia de bits, basta somar as potn-cias de 2 elevado posio de relevncia do bit, para os bits de valor 1.

    1 *27 1 *128 128

    0 *26

    0 *64 01 *2

    5 1 *32 32

    0 *24 0 *16 0

    1 *23 1 *8 8

    0 *22 0 *4 0

    1 *21 1 *2 2

    0 *20 0 *1 0

    Total 170

    Para encontrar o valor hexadecimal, basta calcular o valor decimal de cada grupo de4 bits e comparar com o conjunto de valores em hexadecimal (de 0 a F).

    BINRIO DECIMAL HEXADECIMAL

    1010 10 A

    1010 10 A

    Resposta:

    Binrio = 1010 1010

    Decimal = 170

    Hexadecimal = AA

    a) 1100 0011

    b) 1100 1100

    c) 1101 1111d) 0000 1000

  • 7/26/2019 Estruturas de Dados I

    35/156

    2. Encontre o valor decimal, o nmero negativo em Complemento de 1 e Comple-mento de 2 das strings de bits a seguir, conforme o exemplo da letra a:

    a) 0010 1010

    Para encontrar o valor em decimal de uma sequncia de bits, basta somar as potn-cias de 2 elevado posio de relevncia do bit, para os bits de valor 1.

    0 *27 0 *128 0

    0 *26 0 *64 0

    1 *25 1 *32 32

    0 *24 0 *16 0

    1 *23 1 *8 8

    0 *22 0 *4 0

    1 *21 1 *2 2

    0 *20 0 *1 0

    Total 42

    Para encontrar o Complemento de 1 de uma string de bits, basta inverter o valor detodos os seus bits.

    42

    0 0 1 0 1 0 1 0

    -42 (Complemento de 1)

    1 1 0 1 0 1 0 1

    Para encontrar o Complemento de 2, basta somar 1 ao Complemento de 1 do nmero.

    -42 (Complemento de 2)

    1 1 0 1 0 1 1 0

    a) 0111 1111

    b) 0000 0000

    c) 0110 0011d) 0101 1010

  • 7/26/2019 Estruturas de Dados I

    36/156

    3. Sempre que uma string de bits contiver o valor 1 no primeiro bit da direita onmero ser mpar? Por qu?

    4. Sempre que uma string de bits contiver o valor 1 no primeiro bit da esquerda onmero ser negativo? Por qu?

  • 7/26/2019 Estruturas de Dados I

    37/156

    UN

    IDADE

    II

    Professor Me. Rogrio de Leon Pereira

    PILHAS E FILAS

    Objetivos de Aprendizagem

    Relembrar o conceito de variveis heterogneas.

    Revistar a estrutura de vetores e matrizes.

    Criar novos tipos de estruturas usando registros.

    Aprender sobre pilhas e filas.

    Plano de Estudo

    A seguir, apresentam-se os tpicos que voc estudar nesta unidade:

    Estruturas homogneas e heterogneas

    Vetores e matrizes

    Registros

    Pilhas

    Filas

  • 7/26/2019 Estruturas de Dados I

    38/156

  • 7/26/2019 Estruturas de Dados I

    39/156

    INTRODUO

    Faremos agora uma pequena e breve reviso sobre estruturas homogneas e hete-

    rogneas. Isso se faz necessrio porque elas so a base para a criao de estruturas

    mais complexas como as filas e pilhas.

    Tanto a fila como a pilha so conjuntos ordenados de itens, porm ambas se dife-

    renciam pelas regras de entrada e sada. Na pilha a entrada e a sada de dados se do

    pela mesma extremidade, chamada de topo da pilha. Na fila a entrada e a sada ocor-

    rem em lugares opostos: a entrada acontece no final da fila e a sada no seu incio.Apesar de simples, ambas as estruturas (fila e pilha) so amplamente utiliza-

    das em diversas reas da computao. Um exemplo pode ser visto no problema de

    escalonamento do uso do processador descrito por Machado (2002, p. 138-141).

    A estrutura, a utilizao e as regras de insero e remoo em pilhas e filas so

    o foco de estudo desta unidade.

    ESTRUTURAS HOMOGNEAS E HETEROGNEAS

    A primeira estrutura que estudamos foi a varivel. Ela um local reservado na

    memria para armazenamento de dados. Cada varivel pode armazenar ape-

    nas uma nica informao. Porm, em alguns momentos necessrio guardar

    muitas informaes e a primeira soluo em vista seria declarar variveis emquantidade suficiente para atender a toda a demanda.

    Isso tem muitas desvantagens. Para um programa que vai ler 5 entradas,

    no algo muito trabalhoso, mas imagine ter que ler 50, 100 ou 1000 valores,

    seria necessrio criar muitas variveis, muito cdigo destinado a leitura, pro-

    cessamento e sada.

    Para esses casos, a maioria das linguagens de programao traz estruturas

    prontas para armazenamento mltiplo em uma nica varivel. Elas so clas-

    sificadas em homogneas, que armazenam um nico tipo de informao, eheterogneas, que podem armazenar informaes de tipos diferentes.

    Introduo

    Reproduo

    proibida.

    Art.

    184doC

    digoPenaleLei9

    .610de19defevereiro

    de199

    8.

  • 7/26/2019 Estruturas de Dados I

    40/156

    shutterstock

    PILHAS E FILAS

    Reproduo

    proibida.Art.184do

    CdigoPenaleL

    ei9.610de19defevereiro

    de1998.

    II

    VETORES E MATRIZES

    A declarao de um vetor na linguagem C muito simples, basta declarar uma

    varivel e colocar o seu tamanho entre colchetes logo aps o nome. Pense no

    vetor como uma matriz de uma nica linha e quantidade de colunas equivalente

    ao seu tamanho. O vetor uma estrutura homognea, por isso s pode armaze-nar um nico tipo de dado. Exemplo da declarao em linguagem C de um vetor

    chamado dadoscom capacidade para armazenar 5 valores inteiros:int dados[5];

    Na linguagem C o ndice dos vetores e matrizes comea no valor 0 e vai at

    n - 1, onde n o tamanho do vetor. No exemplo acima, para acessar a primeira

    posio da varivel dados usa-se o ndice 0 e a ltima o ndice 4.dados[0]; // primeira posio do vetor dados

    dados[1]; // segunda posio

    dados[2];

    dados[3];

    dados[4]; // quinta e ltima posio

    As matrizes possuem pelo menos duas dimenses. A declarao parecida

    com a de vetores, precisando indicar tambm a quantidade de linhas alm da

    quantidade de colunas. Abaixo o exemplo da declarao de uma matriz de nme-

    ros reais com duas linhas e trs colunas.

    oat matriz[2][3];

  • 7/26/2019 Estruturas de Dados I

    41/156

    Registros

    Reproduo

    proibida.

    Art.

    184doC

    digoPenaleLei9

    .610de19defevereiro

    de199

    8.

    Lembre-se que so necessrios dois ndices para acessar os dados em uma matriz

    bidimensional.matriz[0][0]; // primeira linha, primeira coluna

    matriz[0][1]; // primeira linha, segunda coluna

    matriz[1][2]; // segunda e ltima linha, terceira e ltima coluna

    REGISTROS

    O registro uma coleo de variveis, e por ser uma estrutura heterognea, per-

    mite o armazenamento de informaes de tipos diferentes. Ele possibilita que o

    programador crie tipos de dados especficos e personalizados.

    A declarao de um registro se d pela palavra reservada struct, seguida pelo

    conjunto de elementos que o compem. Veja um exemplo de um registro cha-

    mado fraction que possui trs elementos: numerator,denominator evalue.structfraction {intnumerator;intdenominator;oatvalue;}

    Aps declarado o registro o seu uso se d como tipo de varivel, assim como

    usado para inteiros, reais, caracteres etc. Cada elemento do registro acessado

    por meio de uma referncia composta pelo nome_da_varivel.

    nome_do_elemento.fraction metade; // cria uma varivel do tipo fractionmetade.numerator = 1; // atribui valor ao elemento numerator

    metade.denominator = 2; // atribui valor ao elemento denominator

    metade.value = metade.numerator / metade.denominator

    possvel criar vetores e matrizes para acomodar mltiplos registros. Vamos

    definir um registro chamado livro para armazenar quatro notas e depois vamos

    criar um vetor para armazenar as notas de 40 alunos.

  • 7/26/2019 Estruturas de Dados I

    42/156

    shutters

    tock

    PILHAS E FILAS

    Reproduo

    proibida.Art.184do

    CdigoPenaleL

    ei9.610de19defevereiro

    de1998.

    II

    struct livro {

    oat nota1;

    oat nota2;

    oat nota3;

    oat nota4;

    }

    livro alunos_notas[40];

    PILHAS

    A Pilha uma das estruturas mais simples e mais versteis

    dentre as utilizadas na computao. Antes de entrar nas

    nuances tcnicas sobre pilhas, vamos abstrair o seu con-

    ceito para uma situao real.

    Imagine estar trabalhando na construo civil. Existeminmeros tijolos que precisam ser organizados e preparados

    para a edificao de um prdio. Voc orientado a empilh-

    -los prximo do local da obra. O primeiro tijolo colocado

    no cho, no local estipulado, em seguida o segundo tijolo

    colocado em cima do primeiro e cada novo tijolo colocado

    no topo da pilha. Na hora de levantar uma nova parede,

    os tijolos so retirados a partir do topo da pilha de tijolos.Os tijolos foram empilhados e depois desempilhados.

    No faz sentido querer pegar o primeiro tijolo que est l

    em baixo na base, mas sim o primeiro que est livre na parte

    de cima. Esse o conceito principal de Pilha. o mesmo

    para uma pilha de camisas, pilha de caixas de leite, pilha de

    papis etc.

  • 7/26/2019 Estruturas de Dados I

    43/156

    shutterstock

    Pilhas

    Reproduo

    proibida.

    Art.

    184doC

    digoPenaleLei9

    .610de19defevereiro

    de199

    8.

    Na informtica, a pilha uma estrutura onde os dados so

    inseridos e removidos no seu topo. So estruturas conheci-

    das como Last In, First Out(LIFO), que pode ser traduzido

    por ltimo a Entrar, Primeiro a Sair.

    Vamos agora pensar em um exemplo para facilitar o

    entendimento. Temos um vetor de 10 posies no qual

    sero inseridos os seguintes valores nessa ordem: 1, 5,

    12 e 3. O vetor deve ficar com essa cara:

    1 5 12 3

    Agora sero inseridos mais dois nmeros na sequncia: 14 e 2. O vetor ficar

    com essa configurao:

    1 5 12 3 14 2

    Pensando que o valor mais esquerda o comeo da pilha, o lado oposto o

    seu final e todos os valores vo entrando na primeira casa livre direita. Esse

    o processo de empilhamento, onde cada novo valor inserido em cima dosvalores previamente inseridos (empilhados).

    Agora preciso remover um valor. Qual ser removido e por qu? O valor

    removido ser o ltimo valor da pilha, j que pela regra, o ltimo valor que entra

    ser o primeiro valor a sair (Last In, First Out). o processo de desempilhamento.

    1 5 12 3 14

    Para se construir uma pilha, so necessrios pelo menos trs elementos: umvetor para armazenar os dados e dois nmeros inteiros, um para marcar o incio

    e outro o final da pilha. Veja o exemplo, a seguir em linguagem C da definio

    de uma estrutura para uma pilha:

  • 7/26/2019 Estruturas de Dados I

    44/156PILHAS E FILAS

    Reproduo

    proibida.Art.184do

    CdigoPenaleL

    ei9.610de19defevereiro

    de1998.

    II

    //Constantes

    #dene tamanho 10//Estrutura da Pilha

    struct tpilha {

    int dados[tamanho];

    int ini;

    int m;

    };

    //Variveis globais

    tpilha pilha;

    Optamos por criar uma constante chamada tamanho para guardar a capacidademxima da pilha. Se houver necessidade de aumentar estaticamente o tama-

    nho da pilha, basta alterar o valor da constante sem precisar revisar o resto do

    cdigo-fonte. Essa constante tambm ser til na hora de fazer verificaes nos

    processos de empilhamento e desempilhamento.

    O vetor dados guardar os valores que forem sendo empilhados, o atributo

    ini marca o incio da pilha e o atributo fim o seu final. Ambas as variveis ini e

    fim so inicializadas com valor zero para indicar que a pilha est vazia.

    Em seguida, vamos criar trs funes, uma para mostrar o contedo dapilha, que ajuda no entendimento e visualizao do processo, uma para a entrada

    (empilhamento) e outra para a sada (desempilhamento).

    A funo pilha_mostrar() muito simples, beirando o trivial. Basta um

    lao de repetio para percorrer todas as posies do vetor e ir imprimindo seus

    valores na tela. Aqui j usamos a constante tamanhopara saber quantos valo-

    res cabem na pilha.

    //Mostrar o contedo da Pilhavoid pilha_mostrar() {

    int i;

    printf([ );

    for (i = 0; i < tamanho; i++) {

    printf(%d , pilha.dados[i]);

    }

    printf(]\n\n);}

    Para a entrada dos dados, criamos a funo pilha_entrar(). Para o empilha-

    mento, necessrio ler o dado diretamente na primeira posio disponvel, querepresenta o topo da pilha. Isso possvel utilizando o atributo fim criado na

  • 7/26/2019 Estruturas de Dados I

    45/156

    Pilhas

    Reproduo

    proibida.

    Art.

    184doC

    digoPenaleLei9

    .610de19defevereiro

    de199

    8.

    estrutura da pilha. Depois da leitura, o valor de fim atualizado para que ele

    aponte sempre para a primeira posio disponvel.//Adicionar um elemento no nal da Pilha

    void pilha_entrar(){

    printf(\nDigite o valor a ser empilhado: );

    scanf(%d, &pilha.dados[pilha.m]);

    pilha.m++;

    }

    Do jeito que est, no h nenhum tipo de controle. Os valores so empilha-

    dos infinitamente, porm, sabemos que a nossa pilha tem um tamanho finito. necessrio criar mecanismos que evitem o estouro da pilha. Vamos escrever

    novamente a funo pilha_entrar()adicionando agora um desvio condicional

    para verificar se existe espao disponvel para o novo empilhamento.

    //Adicionar um elemento no nal da Pilha

    void pilha_entrar(){

    if (pilha.m == tamanho) {

    printf(\nA pilha est cheia, impossvel empilhar um novo

    elemento!\n\n);

    system(pause);}

    else {

    printf(\nDigite o valor a ser empilhado: );

    scanf(%d, &pilha.dados[pilha.m]);

    pilha.m++;

    }

    }

    Agora faremos uma pequena simulao do funcionamento da funo deempilhamento de uma pilha com 5 posies. O vetor dadose as variveis de

    controle ini e fim so inicializados com 0.

    NDICE = 0 1 2 3 4

    DADOS = 0 0 0 0 0

    ini = 0

    fim = 0tamanho = 5

  • 7/26/2019 Estruturas de Dados I

    46/156PILHAS E FILAS

    Reproduo

    proibida.Art.184do

    CdigoPenaleL

    ei9.610de19defevereiro

    de1998.

    II

    Vamos inserir o nmero 42 no final da pilha. A primeira coisa que a funo

    pilha_entrar()faz verificar se a pilha atingiu o seu limite. Isso se d compa-

    rando o atributo fim com a constante tamanho. Como fim (0) diferente de

    tamanho (5), o algoritmo passa para a leitura do dado que ser guardado na

    posiofim do vetor dados. Em seguida, o atributo fim sofre o incremento de 1.

    NDICE = 0 1 2 3 4

    DADOS = 42 0 0 0 0

    ini = 0

    fim = 1

    tamanho = 5

    Vamos inserir mais 3 valores: 33, 22 e 13. Para cada entrada ser feita a veri-

    ficao do atributo fim com a constante tamanho; o valor ser inserido no vetor

    dados na posio fim e o valor de fim ser incrementado em 1.

    NDICE = 0 1 2 3 4DADOS = 42 33 22 13 0

    ini = 0

    fim = 4

    tamanho = 5

    Note que o atributo fim possui valor 4, mas no h nenhum valor inserido

    nessa posio do vetor dados. O atributo fim est apontando sempre para a pri-meira posio disponvel no topo da pilha. Ele tambm representa a quantidade

    de valores inseridos (4) e que atualmente ocupam as posies 0 a 3 do vetor.

    Vamos inserir um ltimo nmero: 9.

    NDICE = 0 1 2 3 4

    DADOS = 42 33 22 13 9

  • 7/26/2019 Estruturas de Dados I

    47/156

    Pilhas

    Reproduo

    proibida.

    Art.

    184doC

    digoPenaleLei9

    .610de19defevereiro

    de199

    8.

    ini = 0

    fim = 5

    tamanho = 5

    Agora a pilha est completa. Se tentarmos inserir qualquer outro valor, a

    comparao de fim (5) com tamanho (5) far com que seja impresso na tela

    uma mensagem informando que a pilha j se encontra cheia, evitando assim o

    seu estouro. O atributo fim contm o valor 5, indicando que existem 5 valores

    no vetor e ele aponta para uma posio invlida, j que um vetor de 5 posies

    tem ndice que comea em 0 e vai at 4.Para o desempilhamento, vamos criar a funo pilha_sair(). A remoo se

    d no elemento fim-1 do vetor dados, lembrando que o atributofim aponta para

    a primeira posio livre, e no esse o valor que queremos remover, mas sim o

    valor diretamente anterior. Aps a remoo do item, o valor defim deve ser atu-

    alizado para apontar corretamente para o final da pilha que acabou de diminuir.

    /Retirar o ltimo elemento da Pilha

    void pilha_sair() {

    pilha.dados[pilha.m-1] = 0;

    pilha.m--;

    }

    O que acontece quando o vetor dadosest vazio? E se removermos mais ele-

    mentos do que existem na pilha? Nesse caso, no haver um estouro na pilha,

    mas voc pode considerar que seria um tipo de imploso. Os vetores no tra-

    balham com ndice negativo, e se muitos elementos fossem removidos alm da

    capacidade do vetor, o valor de fim iria diminuindo at passar a ser um valornegativo. Na hora da incluso de um novo valor, o mesmo seria adicionado em

    uma posio invlida e seria perdido.

    preciso fazer um controle antes da remoo para verificar se a pilha est

    vazia. Vamos comparar ento o valor de ini com fim. Se forem iguais, significa

    que a pilha est vazia e que nenhum valor pode ser removido.

  • 7/26/2019 Estruturas de Dados I

    48/156PILHAS E FILAS

    Reproduo

    proibida.Art.184do

    CdigoPenaleL

    ei9.610de19defevereiro

    de1998.

    II

    //Retirar o ltimo elemento da Pilha

    void pilha_sair() {if (pilha.ini == pilha.m) {

    printf(\nA pilha est vazia, no h nada para desempi-

    lhar!\n\n);

    system(pause);

    }

    else {

    pilha.dados[pilha.m-1] = 0;

    pilha.m--;

    }

    }

    Vamos resgatar agora a estrutura que carinhosamente empilhamos nas pgi-

    nas anteriores.

    NDICE = 0 1 2 3 4

    DADOS = 42 33 22 13 9

    ini = 0fim = 5

    tamanho = 5

    Precisamos remover um nmero. Como no se trata de um vetor qualquer,

    mas sim de uma estrutura em pilha, a remoo comea sempre do ltimo para o

    primeiro (Last In, First Out). O primeiro passo da funo pilha_sair() a com-

    parao dos atributos ini (0) e fim (5), para verificar se a pilha no est vazia.

    Como os valores so diferentes, o algoritmo segue para a linha de remoo.

    muito comum encontrar na literatura os termos push para o processo de

    empilhar e pop para o de desempilhar.

  • 7/26/2019 Estruturas de Dados I

    49/156

    Pilhas

    Reproduo

    proibida.

    Art.

    184doC

    digoPenaleLei9

    .610de19defevereiro

    de199

    8.

    Lembrando que o atributo fim aponta para a primeira posio livre (ou seja, o

    fim da pilha), ento temos que remover o valor do vetor dados na posio fim

    subtraindo-se 1, que a ltima posio preenchida (topo da pilha). Por ltimo,

    atualizamos o valor de fim para que aponte para a posio recm-liberada do

    vetor dados.

    NDICE = 0 1 2 3 4

    DADOS = 42 33 22 13 0

    ini = 0

    fim = 4

    tamanho = 5

    Vamos agora remover os outros valores: 13, 22, 33 e 42. A pilha ir ficar

    desse jeito:

    NDICE = 0 1 2 3 4

    DADOS = 0 0 0 0 0

    ini = 0

    fim = 0

    tamanho = 5

    Se tentarmos agora remover mais algum item da pilha, o programa escre-

    ver uma mensagem de erro na tela, j que o atributo fim(0) est com o mesmo

    valor de ini(0), que significa que a pilha est vazia.A seguir, voc encontrar o cdigo-fonte completo de uma pilha em

    linguagem C. Logo aps coloquei comentrios sobre cada bloco do cdigo.

    Digite o exemplo no seu compilador e execute o programa.

  • 7/26/2019 Estruturas de Dados I

    50/156PILHAS E FILAS

    Reproduo

    proibida.Art.184do

    CdigoPenaleL

    ei9.610de19defevereiro

    de1998.

    II

    1

    2345678910111213141516171819202122

    2324252627282930313233

    34353637383940

    //Bibliotecas

    #include #include #include

    //Constantes#define tamanho 5

    //Estrutura da Pilhastruct tpilha {int dados[tamanho];int ini;int fim;

    };

    //Variveis globaistpilha pilha;int op;

    //Protipaovoid pilha_entrar();void pilha_sair();

    void pilha_mostrar();void menu_mostrar();

    //Funo principalint main(){setlocale(LC_ALL, "Portuguese");op = 1;pilha.ini = 0;pilha.fim = 0;while (op != 0) {system("cls");

    pilha_mostrar();menu_mostrar();scanf("%d", &op);switch (op) {case 1:pilha_entrar();

    break;41424344

    454647

    case 2:pilha_sair();

    break;}

    }return(0);

    }

  • 7/26/2019 Estruturas de Dados I

    51/156

    Pilhas

    Reproduo

    proibida.

    Art.

    184doC

    digoPenaleLei9

    .610de19defevereiro

    de199

    8.

    49505152535455565758596061

    626364656667686970717273747576777879808182

    //Adicionar um elemento no final da Pilhavoid pilha_entrar(){if (pilha.fim == tamanho) {

    printf("\nA pilha est cheia, impossvel empilhar!\n\n");

    system("pause");}else {printf("\nDigite o valor a ser empilhado: ");scanf("%d", &pilha.dados[pilha.fim]);pilha.fim++;

    }}

    //Retirar o ltimo elemento da Pilhavoid pilha_sair() {if (pilha.ini == pilha.fim) {

    printf("\nA pilha est vazia, impossvel desempilhar!\n\n");

    system("pause");}else {pilha.dados[pilha.fim-1] = 0;pilha.fim--;

    }}

    //Mostrar o contedo da Pilhavoid pilha_mostrar() {int i;printf("[ ");for (i = 0; i < tamanho; i++) {printf("%d ", pilha.dados[i]);

    }printf("]\n\n");

    }

    83

    84

    8586

    87

    88

    89

    90

    91

    //Mostrar o menu de opes

    void menu_mostrar() {printf("\nEscolha uma opo:\n");printf("1 - Incluir na Pilha\n");printf("2 - Excluir da Pilha\n");printf("0 - Sair\n\n");

    }

    Linhas 1 a 4

    Incluso de bibliotecas necessrias para o funcionamento do programa.

    Linhas 6 e 7

    Definio de constante para o tamanho da pilha.

  • 7/26/2019 Estruturas de Dados I

    52/156PILHAS E FILAS

    Reproduo

    proibida.Art.184do

    CdigoPenaleL

    ei9.610de19defevereiro

    de1998.

    II

    Linhas 9 a 14

    Registro de estrutura para criar o tipo pilha contando com um vetor para

    armazenar os dados e dois nmeros inteiros para controlar o incio e fim da pilha.

    Linhas 16 a 18

    Definies de variveis.

    Linhas 20 a 24

    Prototipao das funes. Para mais detalhes sobre prototipao, consulte

    o livro de Algoritmos e Estrutura de Dados II.

    Linhas 26 a 47Funo principal (main), a primeira que ser invocada na execuo do

    programa.

    Linha 28

    Chamada de funo para configurar o idioma para portugus, permitindo

    o uso de acentos (no funciona em todas as verses do Windows).

    Linhas 29 a 31

    Inicializao das variveis.

    Linhas 32 a 45

    Lao principal, que ser executado repetidamente at que o usurio decida

    finalizar o programa.

    Linha 33

    Chamada de comando no sistema operacional para limpar a tela.

    Linha 34

    Chamada da funo que mostra o contedo da Pilha na tela.

    Linha 35Chamada da funo que desenha o menu de opes.

    Linha 36

    L a opo escolhida pelo usurio.

    Linhas 37 a 44

    Desvio condicional que faz chamada de acordo com a opo escolhida pelo

    usurio.

    Linhas 49 a 60

    Funo pilha_entrar(), que faz checagem do topo da pilha e insere novosvalores no vetor dados.

  • 7/26/2019 Estruturas de Dados I

    53/156

    shuttersto

    ck

    Filas

    Reproduo

    proibida.

    Art.

    184doC

    digoPenaleLei9

    .610de19defevereiro

    de199

    8.

    Linhas 62 a 72

    Funo pilha_sair(), que verifica se existem elementos na pilha e remove o

    ltimo inserido.

    Linhas 74 a 82

    Funo pilha_mostrar(), que l o contedo e desenha o vetor dados na tela.

    Linhas 84 a 90

    Funo menu_mostrar(), que desenha na tela as opes permitidas para o

    usurio.

    FILAS

    As filas tambm so estruturas muito utilizadas, porm suas particularidades

    fazem com seu que seu funcionamento seja um pouco menos simples do que

    o das pilhas.Voltemos ao exerccio de abstrao e pensemos como as filas esto presentes

    no nosso dia a dia. Isso fcil, o brasileiro adora uma fila e s vezes se encon-

    tra em uma sem saber para qu. Fila no supermercado, fila no cinema, fila no

    banco e assim por diante.

    Chegando a uma agncia bancria, para ser atendido pelo caixa, um cida-

    do honesto se dirige para o final da fila. Quando um caixa fica livre, aquele que

    est na fila h mais tempo (primeiro da fila) atendido.Esse conceito bsico de toda fila FIFO(First In, First Out), ou na tradu-

    o, o Primeiro que Entra o Primeiro que Sai.

    Vamos agora simular uma fila em uma casa lotrica, imaginando que existe

    lugar apenas para 5 pessoas e que o restante dos apostadores esperam fora do edi-

    fcio. O primeiro a chegar Joo, mas

    ele ainda no atendido porque os

    caixas esto contando o dinheiro e se

    preparando para iniciar os trabalhos.

  • 7/26/2019 Estruturas de Dados I

    54/156PILHAS E FILAS

    Reproduo

    proibida.Art.184do

    CdigoPenaleL

    ei9.610de19defevereiro

    de1998.

    II

    Joo

    Em seguida, dois clientes entram praticamente juntos, Maria e Jos, e como

    todo cavalheiro, Jos deixa que Maria fique frente na fila.

    Joo Maria Jos

    Um dos funcionrios est pronto para iniciar o atendimento e chama o cliente.

    Qual deles ser atendido? O Joo, porque ele ocupa o primeiro lugar na fila, jque em teoria o Primeiro que Entra o Primeiro que sai.

    Maria Jos

    Maria passa automaticamente a ser a primeira da fila, ocupando o lugar que

    era de Joo, tendo logo atrs de si Jos aguardando a sua vez de ser atendido.

    Maria Jos

    Agora que est claro o funcionamento de uma fila, vamos program-la em

    linguagem C. A primeira coisa que precisamos definir a sua estrutura. Usaremos

    um vetor para armazenar os valores que sero enfileirados e dois nmeros intei-

    ros para fazer o controle de incio e fim da fila. Usaremos tambm uma constante

    para definir a capacidade de armazenamento.//Constantes

    #dene tamanho 5

    //Estrutura da Fila

    struct tla {

    int dados[tamanho];

    int ini;

    int m;

    };

    //Variveis globais

    tla la;

    Vamos criar uma funo chamada fila_entrar()para controlar a entradade novos valores na fila. A primeira coisa a se fazer verificar se h espao. Isso

  • 7/26/2019 Estruturas de Dados I

    55/156

    Filas

    Reproduo

    proibida.

    Art.

    184doC

    digoPenaleLei9

    .610de19defevereiro

    de199

    8.

    pode ser feito comparando o atributo fimcom a constante tamanho. Caso haja

    uma posio livre, o valor ser inserido no vetor dados na posio fim e final-

    mente o valor de fim incrementado em um.

    //Adicionar um elemento no nal da Fila

    void la_entrar(){

    if (la.m == tamanho) {

    printf(\nA la est cheia, impossvel adicionar um novo va-

    lor!\n\n);

    system(pause);

    }

    else {printf(\nDigite o valor a ser inserido: );

    scanf(%d, &la.dados[la.m]);

    la.m++;

    }

    }

    At agora, a fila e a pilha esto muito parecidas na sua definio e modo de

    entrada de dados. A principal diferena entre as duas estruturas est na forma

    de sada. Na pilha sai sempre o elemento mais recente, na fila sai sempre o maisantigo. Assim como na pilha, necessrio fazer uma verificao na fila para saber

    se ainda existe algum elemento a ser removido.

    //Retirar o primeiro elemento da Fila

    void la_sair() {

    if (la.ini == la.m) {

    printf(\nA la est vazia, no h nada para remover!\n\n);

    system(pause);

    }

    }

    Como o primeiro elemento da fila ser removido, os demais precisam andar

    em direo ao incio, assim como acontece em uma fila de verdade. Em seguida,

    atualizamos o valor do atributofim para apontar corretamente para o final da fila.

    int i;

    for (i = 0; i < tamanho; i++) {

    la.dados[i] = la.dados[i+1];

    }

    la.dados[la.m] = 0;

    la.m--;

  • 7/26/2019 Estruturas de Dados I

    56/156PILHAS E FILAS

    Reproduo

    proibida.Art.184do

    CdigoPenaleL

    ei9.610de19defevereiro

    de1998.

    II

    A funo fila_sair()completa fica com essa cara:

    //Retirar o primeiro elemento da Fila

    void la_sair() {

    if (la.ini == la.m) {

    printf(\nA la est vazia, no h nada para remover!\n\n);

    system(pause);

    }

    else {

    int i;

    for (i = 0; i < tamanho; i++) {

    la.dados[i] = la.dados[i+1];

    }

    la.dados[la.m] = 0;

    la.m--;

    }

    }

    Para finalizar agora, falta apenas a funo fila_mostrar(), que possui um

    lao de repetio que percorre todo o vetor dados e imprime os valores na tela.

    //Mostrar o contedo da Fila

    void la_mostrar() {int i;

    printf([ );

    for (i = 0; i < tamanho; i++) {

    printf(%d , la.dados[i]);

    }

    printf(]\n\n);

    }

    A principal regra para uma fila que o primeiro que entra o primeiro que sai.Esse exemplo no a nica forma de implementao de fila. No nosso caso, cada

    vez que algum sai da fila, todos os outros clientes precisam se mover para a pri-

    meira posio que ficou livre a sua esquerda.

  • 7/26/2019 Estruturas de Dados I

    57/156

    Filas

    Reproduo

    proibida.

    Art.

    184doC

    digoPenaleLei9

    .610de19defevereiro

    de199

    8.

    Existem outras formas de fila, por exemplo, a fila cclica. Ao invs de mover

    os dados para a esquerda sempre que uma posio fica livre, move-se o atributo

    que marca o incio da fila para a direita. Essa uma alternativa interessante para

    quando se tem filas muito grandes e no se pode perder tempo movendo todo

    o resto dos dados em direo ao comeo da fila.

    Vamos voltar ao exemplo da fila anterior com o Joo, a Maria e o Jos.

    Joo Maria Jos

    ini = 0

    fim = 3

    tamanho = 5

    Quando o Joo deixa a fila, no a Maria que anda em direo posio

    ocupada por Joo, mas o incio da fila que se move em direo a Maria.

    Maria Jos

    ini = 1

    fim = 3

    tamanho = 5

    Nesse exemplo, para saber o tamanho da fila, necessrio subtrair o valor

    do atributo fim(3) do atributo ini(1).

  • 7/26/2019 Estruturas de Dados I

    58/156PILHAS E FILAS

    Reproduo

    proibida.Art.184do

    CdigoPenaleL

    ei9.610de19defevereiro

    de1998.

    II

    Apesar de ser implementado de forma diferente, o conceito ainda o mesmo: o

    primeiro que entra o primeiro que sai. Ningum gosta de fura-fila, no verdade?

    Segue agora o cdigo-fonte completo de uma fila em linguagem C. Fiz comen-

    trios explicando cada bloco do cdigo. Digite o exemplo no seu compilador e

    execute o programa.123456789

    1011121314151617181920

    212223242526272829303132

    //Bibliotecas#include #include #include

    //Constantes#define tamanho 5

    //Estrutura da Fila

    struct tfila {int dados[tamanho];int ini;int fim;

    };

    //Variveis globaistfila fila;int op;

    //Protipao

    void fila_entrar();void fila_sair();void fila_mostrar();void menu_mostrar();

    //Funo principalint main(){setlocale(LC_ALL, "Portuguese");op = 1;fila.ini = 0;fila.fim = 0;while (op != 0) {

    comum na literatura o uso do termo enqueue para indicar a insero edequeue para a remoo em filas.

  • 7/26/2019 Estruturas de Dados I

    59/156

    Filas

    Reproduo

    proibida.

    Art.

    184doC

    digoPenaleLei9

    .610de19defevereiro

    de199

    8.

    3334353637383940

    system("cls");fila_mostrar();menu_mostrar();scanf("%d", &op);switch (op) {case 1:fila_entrar();

    break;4142434445

    4647484950515253545556575859606162636465666768697071727374757677

    case 2:fila_sair();

    break;}

    }

    return(0);}

    //Adicionar um elemento no final da Filavoid fila_entrar(){

    if (fila.fim == tamanho) {printf("\nA fila est cheia, volte outro dia!\n\n");

    system("pause");}else {printf("\nDigite o valor a ser inserido: ");scanf("%d", &fila.dados[fila.fim]);

    fila.fim++;}

    }

    //Retirar o primeiro elemento da Filavoid fila_sair() {

    if (fila.ini == fila.fim) {printf("\nFila vazia, mas logo aparece algum!\n\n");

    system("pause");}else {int i;

    for (i = 0; i < tamanho; i++) {fila.dados[i] = fila.dados[i+1];

    }fila.dados[fila.fim] = 0;fila.fim--;

    }}

    787980

    8182

    //Mostrar o contedo da Filavoid fila_mostrar() {

    int i;

    printf("[ ");for (i = 0; i < tamanho; i++) {

  • 7/26/2019 Estruturas de Dados I

    60/156PILHAS E FILAS

    Reproduo

    proibida.Art.184do

    CdigoPenaleL

    ei9.610de19defevereiro

    de1998.

    II

    83

    8485868788899091929394

    95

    printf("%d ", fila.dados[i]);

    }printf("]\n\n");}

    //Mostrar o menu de opesvoid menu_mostrar() {

    printf("\nEscolha uma opo:\n");printf("1 - Incluir na Fila\n");printf("2 - Excluir da Fila\n");printf("0 - Sair\n\n");

    }

    Linhas 1 a 4

    Incluso de bibliotecas necessrias para o funcionamento do programa.

    Linhas 6 e 7

    Definio de constante para o tamanho da fila.

    Linhas 9 a 14

    Registro de estrutura para criar o tipo fila contando com um vetor paraarmazenar os dados e dois nmeros inteiros para controlar o incio e fim da fila.

    Linhas 16 a 18

    Definies de variveis.

    Linhas 20 a 24

    Prototipao das funes. Para mais detalhes sobre prototipao, consulte

    o livro de Algoritmos e Estrutura de Dados II.

    Linhas 26 a 47Funo principal (main), a primeira que ser invocada na execuo do

    programa.

    Linha 28

    Chamada de funo para configurar o idioma para portugus, permitindo

    o uso de acentos (no funciona em todas as verses do Windows).

  • 7/26/2019 Estruturas de Dados I

    61/156

    Filas

    Reproduo

    proibida.

    Art.

    184doC

    digoPenaleLei9

    .610de19defevereiro

    de199

    8.

    Linhas 29 a 31

    Inicializao das variveis.

    Linhas 32 a 45

    Lao principal, que ser executado repetidamente at que o usurio decida

    finalizar o programa.

    Linha 33

    Chamada de comando no sistema operacional para limpar a tela.

    Linha 34

    Chamada da funo que mostra o contedo da Fila na tela.Linha 35

    Chamada da funo que desenha o menu de opes.

    Linha 36

    L a opo escolhida pelo usurio.

    Linhas 37 a 44

    Desvio condicional que faz chamada de acordo com a opo escolhida pelo

    usurio.

    Linhas 49 a 60

    Funo fila_entrar(), que faz checagem do fim da fila e insere novos valo-

    res no vetor dados.

    Linhas 62 a 76

    Funo fila_sair(), que verifica se existem elementos na fila e remove o ele-

    mento mais antigo.

    Linhas 78 a 86

    Funo fila_mostrar(), que l o contedo e desenha o vetor dados na tela.Linhas 88 a 94

    Funo menu_mostrar(), que desenha na tela as opes permitidas para o

    usurio.

  • 7/26/2019 Estruturas de Dados I

    62/156PILHAS E FILAS

    Reproduo

    proibida.Art.184do

    CdigoPenaleL

    ei9.610de19defevereiro

    de1998.

    II

    CONSIDERAES FINAIS

    Na unidade anterior, vimos uma pequena reviso sobre os tipos de variveis e

    aprendemos como elas so alocadas na memria. Isso muito importante, por-

    que uma sequncia de bits nada mais do que um monte de nmeros 1 e 0 sem

    sentido algum. a estrutura de dados que determina como ela deve ser lida e

    qual o seu significado.

    Agora foi a vez de revisarmos as estruturas homogneas e heterogneas. Elas

    so fundamentais para que possamos estudar estruturas mais complexas, comoas pilhas e as filas.

    Os vetores e matrizes permitem que tenhamos em uma nica varivel uma

    coleo grande de dados agrupados. Com os registros podemos criar nova tipa-

    gem de variveis e us-las para definir estruturas capazes de conter informaes

    de diferentes tipos.

    Tanto as pilhas como as filas so tipos de listas, ou seja, coleo de dados

    agrupados. A diferena que tanto a pilha como a fila possuem regras de entrada

    e sada, diferente das listas simples.As pilhas so usadas em problemas onde mais importante resolver o pro-

    blema mais recente, ou mais oneroso, ou mais prximo. J as filas tm funo

    contrria e so aplicadas na soluo de casos onde proibido que questes mais

    recentes recebam ateno antes de questes mais antigas.

    At o momento, trabalhamos com estruturas estticas. Depois de definido

    o tamanho da pilha ou da fila, ele permanecer o mesmo at o final da execuo

    do programa. Na prxima unidade, aprenderemos sobre ponteiros e a sua utili-zao na criao de estruturas dinmicas sem tamanho ou limite pr-definido.

    (Captulos 3 e4).

  • 7/26/2019 Estruturas de Dados I

    63/156

    shutterstock

    1. Quando um livro devolvido na Biblioteca do CESUMAR, o funcionrio respon-svel pelo recebimento coloca o livro em cima de uma pilha de livros na mesa

    ao lado da recepo. O auxiliar de bibliotecrio pega o livro do topo da pilha,verifica o seu cdigo e leva-o para o seu devido local no acervo.

    No atual sistema de informao, possvel verificar se o livro est disponvel ouse est emprestado. Porm, o livro que acabou de ser devolvido ainda no seencontra na prateleira, pois existe um intervalo de tempo entre a devoluo domesmo e o momento em que ele guardado na estante.

    A sugesto do departamento de TI de criar um programa que faa o controlena pilha, assim, pode-se verificar se o livro ainda no foi guardado e qual a suaposio dentro da pilha de livros que aguardam ao lado da recepo.

    a) Crie uma estrutura para a pilha de livros. Lembre-se de que ela tem que terum vetor para armazenar os dados (cdigo, nome do livroe autor) e dois nmeros inteiros, um para controlar oincio e outro o final da pilha.

    b) Defina a varivel que ser um vetor do tipo pilha delivros.

    c) Faa uma funo de empilhamento, lembrando-sede verificar se a pilha atingiu o tamanho mximo de

    livros (a mesa no aguenta muito peso).d) Crie uma funo para desempilhamento de livros, no

    se esquea de que necessrio verificar se ainda exis-tem livros para ser guardados.

    e) Elabore uma funo que apresente na tela a lista detodos os livros que se encontram empilhados ao ladoda recepo.

  • 7/26/2019 Estruturas de Dados I

    64/156

    shutterstock

    2. Uma agncia bancria est querendo inovar o atendimento criando mais con-forto para seus clientes. Para isso, foram colocadas diversas cadeiras na recepo

    do banco. Quando um cliente chega, o atendente lana no computador o seunome e o horrio que chegou. Assim que um caixa fica livre, a recepcionista olhano sistema e chama o primeiro cliente da fila. Dessa forma possvel que osclientes esperem confortavelmente sentados pelo seu atendimento, no impor-tando o local onde se encontrem dentro da agncia bancria.

    a) Faa uma estrutura para o controle da fila. Voc precisa guardar o nome ea hora que o cliente chegou. Use um vetor para armazenar os dados e doisnmeros inteiros, um para controlar o incio e outro o final da fila.

    b) Defina a varivel que ser um vetor do tipo fila de clientes.

    c) Crie uma funo enfileirar, lembrando que preciso verificar se h espaona fila (o nmero de cadeiras na recepo limitado).

    d) Elabore a funo desenfileirar cliente, no se esquea de que necessrioverificar se ainda existem clientes para serem atendidos.

    e) Faa uma funo que apresente na tela a lista de todos os clientes que es-to aguardando atendimento na recepo.

  • 7/26/2019 Estruturas de Dados I

    65/156

    Material Complementar

    MATERIAL COMPLEMENTAR

    Estruturas de DadosFabiana Lorenzi, Patrcia Noll de Mattos e Tanisi Pereira de Carvalho

    Editora: Thomson Learning

    Sinopse: Na cincia da computao so estudados vrios tipos de

    estruturas de dados, sua aplicao e manipulao. A escolha da

    estrutura de dados adequada para representar uma realidade deve

    considerar aspectos como alocao da memria, formas de consulta,

    acesso e operaes de insero e excluso. O objetivo desta obra

    apresentar as principais estruturas de dados conhecidas de uma

    forma prtica e fcil de compreender. So apresentadas as diversasaplicaes dessas estruturas por meio de exemplos de programas em C e em Pascal.

  • 7/26/2019 Estruturas de Dados I

    66/156

  • 7/26/2019 Estruturas de Dados I

    67/156

    UN

    IDADE

    III

    Professor Me. Rogrio de Leon Pereira

    PONTEIROS

    Objetivos de Aprendizagem

    Aprender o conceito de ponteiros.

    Entender como capturar o endereo de uma varivel na memria e

    armazen-la num ponteiro.

    Estudar a relao entre os ponteiros e as demais variveis.

    Verificar as propriedades e aplicaes de ponteiros.

    Alocar variveis dinamicamente em tempo de execuo.

    Plano de Estudo

    A seguir, apresentam-se os tpicos que voc estudar nesta unidade:

    Ponteiros

    Propriedades de ponteiros

    Alocao dinmica na memria

    Criando vetores dinmicos

  • 7/26/2019 Estruturas de Dados I

    68/156

  • 7/26/2019 Estruturas de Dados I

    69/156

    INTRODUO

    Existe uma lenda que atormenta o sono dos programadores, e o nome dela

    Ponteiro. Nesta unidade, voc ver de forma simples e com muitos exemplos

    prticos que no h necessidade de perder o seu sono por causa dos mal fala-

    dos ponteiros.

    Essa estrutura uma das mais importantes, porque graas a ela possvel

    fazer alocao dinmica na memria, navegar nela para frente e para trs a par-

    tir de uma varivel ou de qualquer endereo.Um ponteiro permite ainda que voc monitore endereos na memria, atri-

    bua e recupere valores de variveis sem ao menos toc-las. Entendendo essa

    unidade, voc passar a se sentir mais confiante e ampliar definitivamente os

    seus horizontes como programador.

    PONTEIROS

    Uma varivel um objeto que representa um espao reservado na memria.

    Quando escolhemos o tipo da varivel, estamos definindo o tamanho de bytes

    que ela ter e as regras de como seus bits sero lidos, conforme foi discutindo

    no incio deste livro.

    Um inteiro tem 4 bytes (32 bits), assim como um nmero real, s que nonmero inteiro positivo, todos os bits so significativos, na varivel de ponto

    shutterstock

    Introduo

    Reproduo

    proibida.

    Art.

    184doC

    digoPenaleLei9

    .610de19defevereiro

    de199

    8.

  • 7/26/2019 Estruturas de Dados I

    70/156

    shutterstock

    PONTEIROS

    Reproduo

    proibida.Art.184do

    CdigoPenaleL

    ei9.610de19defevereiro

    de1998.

    III

    flutuante s os primeiros 24 representam valor, os

    ltimos 8 determinam a posio da casa deci-

    mal no nmero.

    Por isso, quando encontramos uma vari-

    vel de 4 bytes alocada na memria, precisamos

    saber qual o seu tipo para fazer a sua correta

    leitura.

    Ao invs de obter o valor armazenado em

    uma varivel, podemos opcionalmente obter o seu endereona memria. Por exemplo, criamos uma varivel xdo tipo inteiro, para saber

    qual o seu endereo, usamos a notao &x. Isso significa que &x um ponteiro

    que aponta para o endereo da varivel x na memria.

    Tambm possvel usar um ponteiro como tipo de dado na declarao de

    uma varivel, s que nesse caso ele no ir guardar um valor, mas sim uma posi-

    o na memria. Vejamos agora exemplos de criao de variveis e ponteiros:#include

    #include

    int xi;

    int *ptr_xi;

    oat xf;

    oat *ptr_xf;

    char xc;

    char *ptr_xc;

    main() {

    system(Pause);

    return(0);

    }

    A varivel xi do tipo inteiro, jptr_xi um ponteiro que aponta para uma

    varivel do tipo inteiro. A mesma relao existe para xfeptr_xf, s que no caso

    deles para armazenar um valor de ponto flutuante e um ponteiro para uma

    varivel do tipo ponto flutuante. Por ltimo, xc uma varivel do tipo caractere

  • 7/26/2019 Estruturas de Dados I

    71/156

    Fonte: ilustrao de Clarissa Brasil

    Fonte: ilustrao de Clarissa Brasil

    Ponteiros

    Reproduo

    proibida.

    Art.

    184doC

    digoPenaleLei9

    .610de19defevereiro

    de199

    8.

    eptr_xcum ponteiro para um caractere.

    Segundo Tenenbaum (1995): [...] um ponteiro como

    qualquer outro tipo de dado em C. O valor de

    um ponteiro uma posio na memria da

    mesma forma que o valor de um inteiro um

    nmero. Os valores dos ponteiros podem ser

    atribudos como quaisquer outros valores (p. 29).

    A imagem, a seguir, simula um espao na memria. Na parte de cima esto

    os endereos e na de baixo os valores contidos naquelas posies. Essa ilustraoajuda a entender melhor o conceito de ponteiro e a sua relao com uma varivel.

    Comoptr_xi um ponteiro, no posso simplesmente atribuir a ele o valor

    de xi, preciso sim atribuir o endereo que xiocupa na memria. Para isso, usa-

    mos a anotao &xi, que significa o ponteiro que aponta para o endereo na

    memria da varivel xi.

    ptr_xi =

    Eu sei queptr_xicontm o endereo de uma varivel, mas como saber ovalor daquele objeto? Para isso, usada a notao *ptr_xi, que significa: o valor

    da varivel para qual aponta o ponteiroptr_xi.

    xi = *ptr_xi;

    Alterei a imagem anterior e inclui as duas

    novas notaes (&xi e *ptr_xi) para demons-

    trar melhor as suas relaes.Existem ainda outros conceitos interes-

    santes sobre ponteiros, porm necessrio

    primeiramente fixar o que foi visto at aqui

    antes de seguirmos com o contedo. Vamos

    partir para a prtica.

    Primeiramente, vamos criar duas variveis, a primeira ser xido tipo inteiro,

    e a segunda serptr_xido tipo ponteiro de inteiro.

    int xi;

    int *ptr_xi;

  • 7/26/2019 Estruturas de Dados I

    72/156PONTEIROS

    Reproduo

    proibida.Art.184do

    CdigoPenaleL

    ei9.610de19defevereiro

    de1998.

    III

    Agora vamos fazer uma funo chamada imprimir(), que vai desenhar na tela o

    valor de xi, &xi,ptr_xie *ptr_xi.

    void imprimir() {

    printf(Valor de xi = %d \n, xi);

    printf(Valor de &xi = %p \n, &xi);

    printf(Valor de ptr_xi = %p \n, ptr_xi);

    printf(Valor de *ptr_xi = %d \n\n, *ptr_xi);

    }

    Lembrando que xi uma varivel do tipo inteira e &xi o ponteiro queaponta para o endereo onde xiest armazenada na memria. A varivelptr_xi

    um ponteiro para um inteiro e *ptr_xi o valor para o qual o ponteiroptr_xi

    est apontando.

    Dentro da funo main(), vamos atribuir o valor 10 para xie o valor de &xi

    paraptr_xi. Em seguida, vamos chamar a funo imprimir()e observar o resultado.main() {

    xi = 10;

    ptr_xi =

    imprimir();

    system(Pause);

    return(0);

    }

    A primeira coisa que a funo imprimir()faz mostrar o valor dexi, que

    sabemos ser 10. Depois imprime o endereo da memria de xi que obtido pela

    notao &xi. A prxima sada o valor deptr_xi, que agora aponta para o ende-reo da varivel xie, por ltimo, o valor de *ptr_xi, que o contedo para onde

    ptr_xiest apontando.

    Valor de xi = 10

    Valor de &xi = 00405020

    Valor de ptr_xi = 00405020

    Valor de *ptr_xi = 10

  • 7/26/2019 Estruturas de Dados I

    73/156

    Ponteiros

    Reproduo

    proibida.

    Art.

    184doC

    digoPenaleLei9

    .610de19defevereiro

    de199

    8.

    Note que o valor deptr_xi o mesmo que &xi, j que quando usamos a nota-

    o &xiconseguimos o endereo da memria da varivel xie o ponteiroptr_xi

    est apontando exatamente para ele. Quando usamos a notao *ptr_xi, conse-

    guimos acessar o endereo de xie resgatar o seu valor armazenado.

    Vamos fazer algo diferente agora. Aps as atribuies iniciais, antes de cha-

    mar a funo imprimir(), vamos alterar o valor da varivel xipara 20.

    main() {

    xi = 10;

    ptr_xi =

    xi = 20;

    imprimir();

    system(Pause);

    return(0);

    }

    O que devemos esperar como sada? D para dizer sem titubear que o valor

    de xiser 20 e no 10, mas e o resto das variveis e notaes, o que elas iro nos

    revelar?Valor de xi = 20

    Valor de &xi = 00405020

    Valor de ptr_xi = 00405020

    Valor de *ptr_xi = 20

    Tantoptr_xiquanto &ximantm o mesmo valor, j que no houve alterao

    da posio na memria que ocupa a varivel xi. Porm, apesar de termos alte-

    rado apenas o valor de xi, o valor de *ptr_xitambm aparece diferente. Comoisso possvel? Como o ponteiroptr_xiaponta para a varivel xi, qualquer alte-

    rao feita em seu contedo ir refletir automaticamente quando verificamos o

    valor de *ptr_xi.

    Vamos fazer mais uma alterao agora, aproveitando tudo o que j foi feito.

    S que ao invs de alterar o valor de xi, vamos t