Você está na página 1de 18

Departamento de Informtica

Curso de Cincia da Computao

ESTRUTURAS
DE DADOS
Professora: Alessandra Dahmer

Santa Cruz do Sul, maro de 2000.

1 INTRODUO
O objetivo desta disciplina introduzir as principais Estruturas de Dados e seus
algoritmos.
Mas antes de mais nada, deve-se responder a uma questo: Qual o papel das
Estruturas de Dados no processo de desenvolvimento de software?
Em um projeto de software, existem dois aspectos que devem ser estudados: os
procedimentos que devem ser previstos pelo software e sobre que dados estes procedimentos
iro atuar.
Nas tcnicas estruturadas de projeto de software era dada nfase aos procedimentos,
com a identificao dos aspectos funcionais na primeira etapa de desenvolvimento do software.
Com as tcnicas para especificao dos dados a nvel conceitual, a importncia dos
procedimentos e dados tornou-se equilibrada. Atualmente, j existem tcnicas de programao
com nfase nos dados (programao baseada em objetos).
Mas, independentemente das tcnicas de anlise e programao utilizadas, programas
precisam manipular dados e extremamente importante o conhecimento de conceitos e
detalhes da implementao das diversas estruturas de dados que manipulam estes dados.
Neste texto, inicialmente, alguns conceitos bsicos so apresentados. seguir, so
descritas as principais Estruturas de Dados, com seus respectivos algoritmos.

2 CONCEITOS BSICOS
Neste captulo, sero apresentados conceitos essenciais para o desenvolvimento desta
disciplina: Tipos de Dados, Tipos Abstratos de Dados e Estruturas de Dados.
2.1 TIPOS DE DADOS
Em computao precisamos identificar os tipos de dados que o computador, a
linguagem de programao ou mesmo um algoritmo so capazes de entender. De uma forma
geral, os Tipos de Dados so diferenciados pelos valores que podem assumir e pelo conjunto
de operaes que podemos efetuar com eles.
Em linguagens de programao o Tipo de Dados de uma varivel define o conjunto de
valores que esta varivel pode assumir. Uma varivel do tipo lgico, por exemplo, pode
assumir dois valores: verdadeiro ou falso. As possibilidades do hardware so previstas pela
linguagem.

Os tipos de dados so divididos em: Tipos Primitivos de Dados e Tipos Estruturados


de Dados.
Os Tipos Primitivos de Dados so os tipos bsicos, a partir dos quais podemos definir
os demais tipos e estruturas de dados. Estes tipos de dados so os mais freqentes nas
linguagens de programao e tem um conjunto de valores e operaes restrito. So
considerados Tipos Primitivos de Dados:
Inteiro - representa uma quantidade que pode ser contada.
Real - Representa um valor que pode ser fracionado.
Lgico - Pode representar dois estados (verdadeiro ou falso).
Caracter - Pode representar dgitos, letras ou sinais.
Ponteiro - Representa o endereo de um dado na memria.
Os Tipos Estruturados de Dados so construdos a partir dos tipos primitivos. Estes
tipos so previstos por muitas linguagens de programao e devem ser definidos pelo
programador. Exemplos de tipos estruturados: array e registro. Estes dois tipos so formados
por tipos bsicos como inteiros, caracteres, reais, etc.
Uma declarao de varivel em uma linguagem de programao como Pascal
especifica duas coisas:
Quantos bytes devem ser reservados para armazenar esta varivel (Ex: no caso de
uma varivel inteira, deve ser reservado um espao que garanta que o maior inteiro
permitido poder ser representado)
Como estes bytes devem ser interpretados (Ex: uma cadeia de bits pode ser
interpretada como um inteiro ou um real).
Assim, Tipos de Dados podem ser vistos como mtodos para interpretar o contedo
da memria do computador.
2.2 TIPOS ABSTRATOS DE DADOS
O conceito de tipo de dados pode ser visto de uma outra perspectiva: levando em
conta, no o que um computador pode fazer, mas o que os usurios desejam fazer. Este
conceito de Tipo de Dados independente do hardware chamado de Tipo Abstrato de
Dados - TAD.
Um Tipo Abstrato de Dados composto por um modelo matemtico acompanhado de
um conjunto de operaes definidas sobre este modelo.
Uma vez que um TAD definido e as operaes associadas a este tipo so
especificadas, pode-se implementar este tipo de dado.

A caracterstica essencial de um TAD a separao entre conceito e implementao.


A descrio dos valores e o conjunto de operaes do TAD so fornecidos ao usurio, mas a
implementao invisvel e inacessvel. A separao da definio do TAD da sua
implementao permite que uma mudana de implementao no altere o programa que usa o
TAD.
Exemplos de TAD:
Listas
Pilhas
Filas
rvores
2.3 ESTRUTURAS DE DADOS
Um algoritmo projetado em termos de tipos abstratos de dados. Para implement-los
numa linguagem de programao necessrio encontrar uma forma de represent-los nessa
linguagem, utilizando tipos e operaes suportadas pelo computador. Para representar o
modelo matemtico do TAD, em uma linguagem de programao, emprega-se uma Estrutura
de Dados.
As Estruturas de Dados diferem umas das outras pela disposio ou manipulao de
seus dados. A disposio dos dados em uma estrutura obedece a condies preestabelecidas e
caracteriza a estrutura.
Assim, Estrutura de Dados um mtodo particular de se implementar um TAD. A
implementao de um TAD escolhe uma estrutura de dados(ED) para represent-lo. Cada ED
pode ser construda a partir de tipos bsicos (inteiro, real, caracter) ou estruturados (array,
registro) de uma determinada linguagem de programao.
O estudo de Estruturas de Dados no pode ser desvinculado de seus aspectos
algortmicos. A escolha correta da estrutura adequada a cada caso depende diretamente do
conhecimento de algoritmos para manipular a estrutura de maneira eficiente.
Por muito tempo os projetos de software consideraram importante identificar as
estruturas de dados e os algoritmos bem cedo no ciclo de vida de um software. Com o
surgimento de linguagens como ADA, tornou-se possvel deixar as decises sobre as ED para
bem mais tarde no projeto de desenvolvimento de software.
Nos prximos captulos sero apresentados as principais Estruturas de Dados utilizadas
para representar listas, pilhas, filas e rvores. Alm disso, sero apresentados os algoritmos que
devem ser utilizados para manipular estas estruturas.

3 LISTAS LINEARES
Definio: Dizemos que um conjunto de registros R={ R1, R2, R3, ..., Rn }, onde n >
0, tem uma estrutura de lista linear para uma determinada relao de precedncia, quando:
R1 o 1 elemento;
Rn o ltimo elemento;
Rk precede Rk+1 para 1 k < n;
As listas lineares so estruturas de tamanho varivel e podem ter seus elementos
ordenados ou no. Cada elemento de uma lista linear pode tambm ser chamado de nodo ou
n.
As operaes mais frequentes em listas lineares so as seguintes::
1) Acessar o k-simo elemento (Exemplo: Acessar o segundo elemento - k=2 )
2) Inserir nodo antes/depois do k-simo elemento
3) Retirar o k-simo elemento (Exemplo: Acessar o terceiro elemento - k=3 )
4) Contar o nmero de nodos (A contagem do nmero de nodos define o tamanho, ou
comprimento, da lista)
5) Pesquisar por um valor (A pesquisa por um valor busca encontrar a posio do
nodo que contm a informao que est sendo procurada)
6) Combinar (Combinar duas listas lineares colocar os elementos das duas listas em
uma s, de forma ordenada ou no)
7) Dividir (Listas lineares podem ser divididas em duas ou mais listas, de acordo com
algum critrio pr-definido. Exemplo: Dividir a lista ao meio)
8) Classificar (Os elementos de uma lista linear podem ser classificados. Exemplo:
Elementos em ordem alfabtica)
Casos particulares de listas, definidos basicamente com restries para incluses e
remoes nas listas, sero detalhados nos prximos captulos. So eles: pilhas, filas e deques.
As listas lineares so classificadas de acordo com o tipo de armazenamento em: listas
lineares sequenciais e as listas lineares encadeadas. A seguir sero apresentados estes dois
tipos de listas e os respectivos algoritmos para implementar as principais operaes.

3.1 LISTAS SEQUENCIAIS


As listas lineares sequenciais utilizam alocao sequencial, neste tipo de alocao devese estabelecer previamente o tamanho definitivo da lista. Nas linguagens de programao a
maneira mais utilizada para implementar este tipo de lista o vetor.
Os espaos da lista so ocupados sequencialmente na memria. A identificao dos
registros ocupados gerenciada pela linguagem ou pelo prprio programador. Geralmente
utiliza-se um ponteiro para indicar a ltima posio ocupada ( na figura abaixo
representado por f).

A seguir sero apresentados os algoritmos para implementar as principais operaes


com listas lineares sequencias, como a representada pela figura acima.
1) Acessar o k-simo elemento:
if k > f or k < 1
then Elemento no existe
else VALOR INFOk
2) Inserir Nodo depois do k-simo elemento:
if k > f or k < 1
then K-SIMO ELEMENTO NO EXISTE
else if f = n
then LISTA CHEIA
else
i f
while i > k
INFOi+1 INFOi
i i - 1
INFOk+1 VALOR
f f + 1

3) Inserir Nodo antes do k-simo elemento:


if k > f or k < 1
then K-SIMO ELEMENTO NO EXISTE
else if f = n
then LISTA CHEIA
else
i f
while i k
INFOi+1 INFOi
i i - 1
INFOk VALOR
f f + 1

4) Retirar o k-simo elemento:


if k > f or k < 1
then K-SIMO ELEMENTO NO EXISTE
else
VALOR INFOk
while k < f
INFOk INFOk+1
k k+1
f f - 1

5) Contar o Nmero de Nodos:


CONTA 0
if f ^ then CONTA f

6) Pesquisar por um valor:


k1
while k f and INFOk VALOR
kk+1
if k f
then ACHEI NA POSIO k
else NO ACHEI

7) Inserir Nodo na posio correta em uma lista sequencial ordenada, sem repeties de
elementos:
if f = n
then LISTA CHEIA
else
if f = ^
then
f f + 1
INFOf VALOR
else
kf
while k ^ and INFOk > VALOR
kk-1
if k = ^ or INFOk < VALOR
then
i f
while i > k
INFOi+1 INFOi
i i - 1
INFOi+1 VALOR
f f + 1
else VALOR J EST NA LISTA
3.2 LISTAS ENCADEADAS
As listas encadeadas utilizam alocao dinmica. Este tipo de alocao ideal quando
no pode-se definir previamente o tamanho da lista. Assim, no possvel definir o tamanho de
memria necessrio para armazenar toda a lista.
Neste caso, so utilizados registros distribudos aleatoriamente na memria e
interligados atravs de ponteiros para o endereo de memria para o prximo elemento. Uma
lista encadeada pode ser representada pela figura abaixo:

Cada elemento da lista formado por um campo de informao (INFO) e por um


ponteiro para o prximo elemento (PROX).
Existem uma rotina para alocar espao na memria para armazenar cada novo
elemento da lista e outra para liberar a memria de um elemento retirado da lista. Nos

algoritmos apresentados a seguir estas rotinas sero representadas por: ALOQUE e


DESALOQUE, respectivamente.
3.2.1 Listas Simplesmente Encadeadas

INICIAL:
i ^
1) Acessar o k-simo elemento:
if i = ^ or k < 1
then Elemento no existe
else
ji
CONTA 1
while CONTA < k and j ^
j PROXj
CONTA CONTA + 1
if j = ^
then NO EXISTE ELEMENTO K
else VALOR INFOj
2) Inserir Nodo depois do nodo apontado por k:
ALOQUE(t)
INFOt VALOR
PROXt PROXk
PROXk t
3) Inserir Nodo antes do nodo apontado por k:
ALOQUE(t)
INFOt VALOR
PROXt k
if i = k
then i t
else a i
while PROXa k
a PROXa
PROXa t

4) Retirar o nodo apontado por k:


if i = k
then i PROXi
else a i
while PROXa k
a PROXa
PROXa PROXk
DESALOQUE(k)
5) Contar o Nmero de Nodos:
CONTA 0
pi
while p ^
CONTA CONTA + 1
p PROXp
6) Pesquisar por um valor:
pi
while p ^ and INFOp VALOR
p PROXp
if p ^
then ACHEI
else NO ACHEI
7) Combinar duas listas:
PROXf p
f j
p^
j^

10

4 PILHAS
Uma pilha uma lista linear na qual todas as inseres e remoes so efetuadas no
mesmo extremo da lista, no final da lista linear. Ou seja:
A insero de um elemento torna-o o ltimo da lista linear
O elemento retirado na remoo sempre o ltimo elemento da lista (topo).

Devido s caractersticas das operaes da pilha, o ltimo elemento a ser inserido ser
o primeiro a ser retirado. Estruturas deste tipo so conhecidas como LIFO (Last In, First
Out).
Notao:
Topo da Pilha: elemento ao qual se tem acesso imediato
Empilhar: colocar um elemento no topo da pilha
Desempilhar: retirar o elemento do topo
Exemplo: Em Pascal, as pilhas so utilizadas para implementar a recursividade em um
programa.

4.1 PILHAS SEQUENCIAIS

INICIAL:
t^
(TOPO DA PILHA)

11

EMPILHAR (PUSH)

DESEMPILHAR (POP)

if t = n

if t = ^
then OVERFLOW
else
tt+1
INFOt VALOR

then UNDERFLOW
else
VALOR INFOt
tt-1

4.2 PILHAS ENCADEADAS

INICIAL:
t^
(TOPO DA PILHA)

EMPILHAR (PUSH)

DESEMPILHAR (POP)

ALOQUE(p)
INFOp VALOR
PROXp t
tp

if t = ^
then UNDERFLOW
else
VALOR INFOt
pt
t PROXt
DESALOQUE(p)

Obs: A rotina ALOQUE j prev o OVERFLOW.

12

5 FILAS
Uma fila uma lista linear onde todas as operaes de insero so efetuadas apenas
no final e remoes apenas no incio da lista linear. Ou seja:
A insero de um elemento torna-o o ltimo da lista linear
O elemento retirado na remoo sempre o primeiro

Devido s caractersticas das operaes da fila, o primeiro elemento a ser inserido ser
o primeiro a ser retirado. Estruturas deste tipo so conhecidas como FIFO (First In, First
Out).
Exemplo: Fila de uma impressora, onde as primeiras solicitaes que chegam so as
primeiras a serem impressas.

5.1 FILAS SEQUENCIAIS

INSERO

REMOO

if SUC(f) = 1
then OVERFLOW
else
f SUC(f)
INFOf VALOR

if i = f
then UNDERFLOW
else
i SUC(i)
VALOR INFOi

13

SUC(p)
if p = n
then SUC 1
else SUC p + 1

Obs : A Rotina SUC implementa a lista sequencial de maneira circular, permitindo que
todos os espaos livres da lista possam ser ocupados.
5.2 FILAS ENCADEADAS
5.2.1 Filas Simplesmente Encadeadas

INICIAL:
i ^
f ^

INSERO

REMOO

ALOQUE(p)
INFOp VALOR
PROXp ^
if i = ^
then i p
else PROXf p
fp

if i = ^
then UNDERFLOW
else
pi
i PROXi
VALOR INFOp
DESALOQUE(p)

5.2.2 Filas Encadeadas com Header

14

INICIAL:
ALOQUE(i)
PROXi ^
f ^

INSERO

REMOO

ALOQUE(p)
INFOp VALOR
PROXp ^
PROXf p
fp

if PROXi = ^
then UNDERFLOW
else
p PROXi
VALOR INFOp
PROXi PROXp
if p = f then f i
DESALOQUE(p)

5.2.3 Filas Encadeadas Circulares com Header

INICIAL:
ALOQUE(i)
PROXi i
f ^

INSERO

REMOO

ALOQUE(p)
INFOp VALOR
PROXp i
PROXf p
fp

if PROXi = i
then UNDERFLOW
else
p PROXi
VALOR INFOp
PROXi PROXp
if p = f then f i
DESALOQUE(p)

15

6 DEQUES
Um deque (Double-Ended QUEue) uma lista linear onde as operaes de
insero e remoo podem ser efetuadas tanto no incio quanto no final da lista linear. Ou seja:
A insero de um elemento pode torn-lo o primeiro ou o ltimo da lista linear
O elemento retirado na remoo o primeiro ou o ltimo elemento da lista

Existem variaes de deque, restries nos deques faz com que uma das operaes s
possa ser efetuada em uma das extremidades do deque:
deque de entrada restrita:
onde as inseres s podem ser
efetuadas ou no incio ou no final
da lista linear

deque de sada restrita: onde


as remoes s podem ser
efetuadas ou no incio ou no final
da lista linear

Podemos perceber que pilhas e filas so casos particulares de deque, dependendo das
restries que forem feitas quanto insero e retirada.

16

6.1 DEQUES SEQUENCIAIS

INSERO - EXT.A

REMOO - EXT.A

if PRED(i) = f
then OVERFLOW
else
i PRED(i)
INFOi VALOR

if i = f
then UNDERFLOW
else
VALOR INFOi
i SUC(i)

INSERO - EXT.B

REMOO - EXT.B

if SUC(f) = 1
then OVERFLOW
else
INFOf VALOR
f SUC(f)

if i = f
then UNDERFLOW
else
f PRED(f)
VALOR INFOf

SUC(p)
if p = n
then SUC 1
else SUC p + 1

PRED(p)
if p = 1
then PRED n
else PRED p - 1

Obs : As rotinas SUC(sucessor) e PRED(predecessor) implementam o deque


sequencial de forma circular, permitindo que todos os espaos livres da lista possam ser
ocupados.

17

6.2 DEQUES ENCADEADOS

INSERO - INCIO
ALOQUE(p)
INFO(p) VALOR
PROXp PROXi
ANTp i
ANTPROXp p
PROXi p

REMOO - INCIO
if PROXi = i
then UNDERFLOW
else
p PROXi
PROXANTp PROXp
ANTPROXp ANTp
DESALOQUE(p)

INSERO - FINAL
ALOQUE(p)
INFO(p) VALOR
f ANTi
PROXp PROXf
ANTp f
ANTPROXp p
PROXf p

REMOO - FINAL
if PROXi = i
then UNDERFLOW
else
p ANTi
PROXANTp PROXp
ANTPROXp ANTp
DESALOQUE(p)

18

Você também pode gostar