Transcript
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
top related