Vous êtes sur la page 1sur 30

Algoritmos e Estruturas de Dados – I

Estruturas de dados lineares

José Braga de Vasconcelos


jvasco@ufp.pt

Universidade Fernando Pessoa


Faculdade de Ciência e Tecnologia
Praça 9 de Abril, 349
P4200 Porto Portugal
+351 22 5071306

Outubro 2004
Estruturas de dados lineares
de comprimento variável

• Pilhas (stacks)
• Filas (queues)
- Filas simples
- Filas Circulares

• Listas lineares encadeadas (linked linear lists)


- Listas lineares simplesmente encadeadas
- Listas lineares duplamente encadeadas
Pilhas (stacks)

Pilha (stack)
Estrutura de dados de comprimento variável, cujas caracteristicas
principais são as seguintes:

O primeiro elemento inserido é o último a ser eliminado ou retirado da


pilha (FILO – First In Last Out).
O último elemento inserido é o primeiro a ser eliminado (LIFO – Last
In First Out).

Campos de aplicação das pilhas


- Análise de expressões matemáticas
- Algoritmos para a implementação de tratamento de texto
- Recursividade (algoritmos recursivos)
Representação de Pilhas (stacks)

Elementos disponíveis

Inserção Eliminação

X
Topo da pilha
X
X
Elementos usados

Base da pilha
Representação de Pilhas (stacks)

Uma Pilha é representada através de um vector (S[], por exemplo)


com dimensão N. O Ponteiro TOP representa o topo da pilha.

Vector S que
S[N] simula a pilha

N Ponteiro que indica a posição


Top do último elemento inserido
Número máximo
na pilha
de elementos da
pilha.
X
X
X
Pilhas – Algoritmos
Rotinas e Funções de manipulação

Rotina de inserção

Procedure Push (S,TOP,X)


Rotina que insere (empilha) um novo elemento X no topo de uma
pilha que é representada pelo vector S que contém no máximo N
elementos e um ponteiro TOP que indica a posição do último
elemento inserido.

1. [Testar a capacidade da pilha]


If TOP >= N
Then Write (‘Excedeu a capacidade da pilha (stack overflow)’)
Return
2. [Incrementar O TOP]
TOP ß TOP + 1
3. [Inserir o elemento]
S[TOP] ß X
4. [Terminar]
Return
Pilhas – Algoritmos
Rotinas e Funções de manipulação

Função de remoção

Function Pop (S,TOP)


Função que remove (‘desempilha’) o elemento do topo de uma pilha
que é representada pelo vector S e um ponteiro TOP que indica a
posição do último elemento inserido. O elemento eliminado é
devolvido ao programa (algoritmo) principal.

1. [Testar se existem elementos na pilha]


If TOP = 0
Then Write (‘Não existem elementos (stack underflow)’)
exit
2. [Decrementar O TOP]
TOP ß TOP - 1
3. [Devolver o elemento eliminado]
Return(S[TOP+1])
Pilhas – Algoritmos
Rotinas e Funções de manipulação

Função de pesquisa

Function Peep (S,TOP, I)


Função que devolve o iº elemento a contar do do topo de uma pilha
que é representada pelo vector S e um ponteiro TOP que indica a
posição do último elemento inserido. O elemento devolvido não é
eliminado.

1. [Testar se existem elementos na pilha]


If TOP – I + 1 <= 0
Then Write (‘O elemento’, ‘I’ não existe’)
exit
2. [Devolver o Iº elemento a contar do topo da pilha]
Return(S[TOP-I+1])
Pilhas – Algoritmos
Rotinas e Funções de manipulação

Rotina de alteração

Procedure Change (S,TOP, I, X)


Rotina que permite alterar o iº elemento a contar do do topo de uma
pilha por outro elemento (valor) representado na variável X. A
pilha é simulada através do vector S e um ponteiro TOP que indica
a posição do último elemento inserido.

1. [Testar se existem elementos na pilha]


If TOP – I + 1 <= 0
Then Write (‘O elemento’, ‘I’ não existe’)
exit
2. [Alterar o Iº elemento a contar do topo da pilha]
S[TOP-I+1] ß X
3. [Terminar]
Return
Pilhas – Algoritmos - Exercícios
Algoritmo Caracol
Suponha a advinha do caracol que se encontra no fundo de um poço de ALT
metros, subindo cada dia MET_SUB metros e descendo MET_DESC metros.
Quantos dias demora o caracol a chegar ao topo? Este algoritmo utiliza uma pilha
de modo a determinar a advinha.
1. [Criação da pilha] Top-Down
Read (N)
TOP ß0 - Criar a pilha
2. [Leitura de valores e inicializações] - Leitura e inicializações
Read (ALT, MET_SUB, MET_DESC) - Fazer enquanto o topo da pilha é menor
DIA ß0
3. [Ciclo de processamento] do que a altura do poço
Do While TOP < ALT - Empilha os metros subidos
[empilha] - Incrementa o número de dias
I ß1
Do While TOP <= ALT And I <= MET_SUB - Desempilha os metros descidos
Call Push (S,TOP,I) - Imprime número de dias
IßI+1
[Contagem dos dias]
DIA ß DIA + 1
[Desempilha]
If TOP < ALT
Then Do For DES = 1 to MET_DESC
SAID ß Pop (S,TOP)
4. [Imprimir o número de dias]
S[TOP-I+1] ß X
5. [Terminar]
Exit
Pilhas – Algoritmos - Exercícios
Algoritmo Letras invertidas
Suponha ter uma alfanumérica com uma sequência de caracteres A1 = (a,b,c,d,e,f,g,h,i,j).
Suponha ter outra alfanumérica, cujo conteúdo da sequência de caracteres é
normalmente invertida, por exemplo A2 = (j,i,h,g,f,e,d,.,.,.). Formule um algoritmo que
usando pilhas nos avise quando se verificam disparidades.
1. [Cria as pilhas] Top-Down
Read (N)
TOP1 ß 0 - Criar as pilhas
TOP2 ß 0 - Leitura das strings
2. [Leitura das strings] - Fazer para todos os caracteres A1
Read (A1,A2)
3. [Preenche pilha 1] - Retirar caracter
Do For I = 1 to Length(A1) - Empilha pilha1
CAR ßSub(A1,I,1) - Fazer para todos os caracteres A2 do fim
Call Push (S1,TOP1,CAR) para o principio
3. [Preenche pilha 2]
Do For I = Length(A2) to 1 Step -1 - Retirar caracter
CAR ßSub(A2,I,1) - Empilha pilha 2
Call Push (S2,TOP2,CAR) - Para todos os elementos das pilhas
4. [Compara os elementos das pilhas] - Desempilha Pilha 1 e Pilha 2
DO For I = 1 to Length (A1)
CAR1 ß Pop(S1,TOP1) - Compara
CAR2 ß Pop(S2,TOP2) - Erro se existir disparidades
If CAR1 <> CAR2
Then Write (CAR1, ‘ não coincide com ‘, CAR2)
5. [Terminar]
Exit
Filas (Queues)

Fila (Queue)
Estrutura de dados de comprimento variável com as seguintes
características:

A informação é processada pela ordem que foi recebida, isto é, o


primeiro elemento a ser inserido é o primeiro elemento a ser eli minado
(FIFO – First In First Out / FCFS – First Come First Served).
O inserção é efectuada na retaguarda (direita) da fila e a eliminação é
efectuada na frente (esquerda) da fila.

Campos de aplicação das filas


- Filas de espera em diversos domínios
- Algoritmos para a representação de processos que envolvem a
partilha e distribuição de recursos (timesharing).
- Recursividade (algoritmos recursivos)
Representação de Filas

Frente da fila Retaguarda da fila

Eliminação X X X
Inserção

Elementos disponíveis
Elementos usados
Representação de Filas

Uma Fila é representada através de um


vector Q com dimensão N Q[]

Frente da fila Retaguarda da fila

Eliminação X X X X
Inserção

F R
Os ponteiros F e R apontam respectivamente
para o elemento da frente e para o elemento da
retaguarda da fila
Filas – Algoritmos
Rotinas e Funções de manipulação

Rotina de inserção

Procedure QInsert (Q,F,R,Y)


Rotina que insere um novo elemento Y na retaguarda da fila. O
vector Q está dimensionado para N elementos. Os ponteiros F e R
indicam respectivamente a frente e a retaguarda da fila.

1. [Testar a capacidade da fila]


If R >= N
Then Write (‘Excedeu a capacidade da fila (queue overflow)’)
F=R=0 (fila vazia)
Return
2. [Incrementar o ponteiro da retaguarda]
R ß R+1
3. [Inserir o elemento] .
.
Q[R] ß Y F R .
4. [Verificar o ponteiro da frente e termina]
X X X
If F = 0
Then F ß1
Return
1 2 3 4 5 6 7
Filas – Algoritmos
Rotinas e Funções de manipulação

Função de eliminação

Function QDelete (Q,F,R)


Função que elimina um elemento da frente da fila e devolve-o ao
programa principal. A fila representada através do vector Q está
dimensionada para N elementos. Os ponteiros F e R indicam
respectivamente a frente e a retaguarda da fila.
1. [Verificar se a fila contem elementos] 1 2 3 4 5 6 7
If F = 0 X X X
Then Write (‘Fila vazia (queue underflow)’)
Exit
F R
2. [Armazenar o elemento a eliminar]
Y ß Q[Y] X X
3. [Fila Vazia?]
F=R
If F = R
Then F ß 0 X
Rß0
Else F ß F + 1
4. [Devolver o elemento] F=R=0 (fila vazia)
Return (Y)
Filas circulares

Uma fila simples pode desperdiçar diversas posições de


memória, dado que em determinados casos impossibilita a
inserção de novos elementos sem ter a fila cheia. Para
resolver este problema, surgiram as filas circulares.

Fila circular
De modo a optimizar o armazenamento de dados e respectiva gestão
de espaço na memória principal do computador, as filas circulares
seguem os mesmos princípios das filas simples, mas têm uma gestão
mais eficaz em termos de armazenamento.
Representação de filas circulares

Uma Fila Circular é representada através


de um vector Q com dimensão N Q[]

R Retaguarda da fila
Q[4]
... Q[3]

Q[N-2]
Q[2]

Q[N-1]
Q[1]
Q[N]

F Frente da fila

Os ponteiros F e R apontam respectivamente


para o elemento da frente e para o elemento da
retaguarda da fila
Filas Circulares – Algoritmos
Rotinas e Funções de manipulação

Rotina de inserção

Procedure CQInsert (Q,F,R,Y)


Rotina que insere um novo elemento Y na retaguarda de uma fila
circular. O vector Q está dimensionado para N elementos. Os ponteiros F
e R indicam respectivamente a frente e a retaguarda da fila circular.
Inicialmente (fila vazia) os ponteiros F e R são inicializados a zero.
1. [Repocionar o ponteiro da retaguarda]
If R = N
Then R ß 1
Else R ß R + 1
2. [Verificar se excede capacidade]
If F = R
Then Write(‘Queue Overflow’)
Return
3. [Inserção do elemento na retaguarda da fila circular]
Q[R] ß Y
4. [Verificar o ponteiro da frente e retornar]
If F = 0
Then F ß 1
Return
Estruturas de dados lineares
- Listas lineares encadeadas

Listas Simplesmente Encadeadas


• Listas Lineares Simplesmente Encadeadas

• Listas Lineares Simplesmente Encadeadas Circulares

• Listas Lineares Simplesmente Encadeadas Circulares Encabeçadas

Listas Duplamente Encadeadas


• Listas Lineares Duplamente Encadeadas

• Listas Lineares Duplamente Encadeadas Circulares

• Listas Lineares Simplesmente Encadeadas Circulares Encabeçadas


Estruturas de dados lineares
- Listas lineares encadeadas

Características Principais

O armazenamento dos dados é efectuado através de estruturas de dados


lineares encadeadas.

A estrutura principal de uma lista designa-se por NODO a qual representa uma
estrutura de dados composta por um ou mais campos de informação (INFO) e
por um ou mais campos de ligação (ELO).

O campo INFO permite armazenar informação.


O campo ELO permite apontar para outro nodo.
Estruturas de dados lineares
- Listas lineares encadeadas

NODO

INFO ELO

INFO [ ] ? Contém informação associada ao nodo


ELO [ ] ? Contém o endereço do nodo seguinte
Estruturas de dados lineares
- Listas lineares encadeadas

Exemplo

INFO ELO

‘Ana’ 11 ‘Filipa’ 17 ‘José’ 7 ‘Maria’

11 17 7
PRIM

Endereços dos Nodos

INFO [PRIM] = “Ana”


ELO [PRIM] = 11
INFO [17] = “José”
INFO [ELO[PRIM]] = “Filipa”
Estruturas de dados lineares
- Listas lineares encadeadas

Pilha dos Disponíveis

DISP NOVO

NOVO DISP
DISP ELO[DISP]

DISP

.. ..
. .

Antes de obter um nodo Depois de obter nodo


Estruturas de dados lineares
- Listas lineares encadeadas

Variáveis Ponteiro Utilizadas

PRIMEIRO
Variável ponteiro que representa o endereço do primeiro nodo da lista linear simplesmente
encadeada.

DISP
Variável ponteiro que representa o endereço do nodo do topo da pilha dos disponíveis.

NOVO
Variável ponteiro que representa o endereço a obter referente ao próximo nodo disponível
(nodo do topo da pilha de disponíveis). Endereço de um novo nodo para uma lista.

NULO
Variável ponteiro que representa o endereço nulo.
LISTAS – Algoritmos
Rotinas e Funções de manipulação

Function Insert (X,PRIM)


Função que permite inserir um novo elemento X no inicio de uma lista linear
simplesmente encadeada. Pretende-se que X preceda o nodo cujo endereço é dado
por PRIM. A variável NOVO representa o endereço do novo nodo e DISP
representa o endereço do próximo nodo disponível.

1. [Testar a capacidade da pilha dos disponíveis]


If DISP = NULO
Then Write (‘Não existem Nodos disponíveis’)
Return(PRIM)
2. [Obter o endereço do próximo nodo livre]
NOVO ß DISP
3. [Retirar o nodo livre da pilha dos disponíveis]
DISP ß ELO[DISP]
4. [Tratar os campos INFO e ELO do novo nodo]
INFO[NOVO]ß X
ELO[NOVO] ß PRIM
5. [Devolver o endereço do primeiro nodo da lista]
Return(NOVO)
LISTAS – Algoritmos
Rotinas e Funções de manipulação
Function Insend (X,PRIM)
Função que permite inserir um novo elemento X no fim de uma lista linear simplesmente
encadeada. A variável NOVO representa o endereço do novo nodo e DISP representa o
endereço do próximo nodo disponível. PTEMP é uma variável ponteiro temporária.

1. [Testar a capacidade da pilha dos disponíveis]


If DISP = NULO
Then Write (‘Não existem Nodos disponíveis’)
Return(PRIM)
2. [Obter o endereço do próximo nodo livre]
NOVO ß DISP
3. [Retirar o nodo livre da pilha dos disponíveis]
DISP ß ELO[DISP]
4. [Tratar os campos do novo nodo]
INFO[NOVO]ß X
ELO[NOVO] ß NULO
5. [Lista vazia?]
If PRIM = NULO
Then RETURN(NOVO)
6. [Pesquisar o fim da lista]
PTEMP ß PRIMEIRO
Do While ELO[PTEMP] <> NULO
PTEMP ß ELO[PTEMP]
7. [Posicionar o elo para o último nodo]
ELO[PTEMP] ß NOVO
8. [Posicionar o elo para o último nodo]
Return(PRIM)
Estruturas de dados lineares
- Listas lineares simplesmente encadeadas

Eliminação de nodos

Rotina de eliminação através do endereço de um nodo


- Verificar se a lista está vazia,
- Pesquisar o nodo cujo endereço é igual ao endereço a eliminar (parâmetro da rotina),
- Verificar se existe o nodo a eliminar,
- Eliminar o nodo através da reposição do elo do nodo adjacente,
- Devolver o nodo eliminado para a pilha de disponíveis.

Rotina de eliminação através do campo de informação de um nodo


- Verificar se a lista está vazia,
- Pesquisar o nodo cujo conteúdo do campo de informação (INFO) é igual ao valor
dado (parâmetro da rotina),
- Verificar se existe o nodo a eliminar,
- Eliminar o nodo através da reposição do elo do nodo adjacente,
- Devolver o nodo eliminado para a pilha de disponíveis.
LISTAS – Algoritmos
Rotinas e Funções de manipulação
Procedure Delete (E,PRIM)
Rotina que permite eliminar um nodo identificado pelo endereço E. PTEMP e ANT são
variáveis ponteiro temporárias. O nodo eliminado é devolvido à pilha de disponíveis.

1. [Lista vazia?]
If PRIM = NULO
Then Write (‘Lista vazia’)
Return
2. [Pesquisar o endereço E]
Do While PTEMP <> E and ELO[PTEMP] <> NULO
ANT ß PTEMP
PTEMP ß ELO[PTEMP]
3. [Fim da lista?]
If PTEMP <> E
Then Write (‘O Nodo com endereço ’,E,’ não existe’)
Return
4. [Eliminação do nodo]
If PTEMP = PRIMEIRO
Then PRIM ß ELO[PRIM]
Else ELO[ANT] ß ELO[PTEMP]
5. [Devolver o nodo eliminado à pilha de disponíveis]
ELO[PTEMP] ß DISP
DISP ß PTEMP
Return
LISTAS – Algoritmos
Rotinas e Funções de manipulação
Procedure Delete (X,PRIM)
Rotina que permite eliminar um nodo que contem a informação dada pela variável X. PTEMP e
ANT são variáveis ponteiro temporárias. O nodo eliminado é devolvido à pilha de disponíveis.

1. [Lista vazia?]
If PRIM = NULO
Then Write (‘Lista vazia’)
Return
2. [Pesquisar o nodo que contem X]
Do While INFO[PTEMP] <> X and ELO[PTEMP] <> NULO
ANT ß PTEMP
PTEMP ß ELO[PTEMP]
3. [Fim da lista?]
If INFO[PTEMP] <> X
Then Write (‘O Nodo com INFO igual a ’,X,’ não existe’)
Return
4. [Eliminação do nodo]
If PTEMP = PRIMEIRO
Then PRIM ß ELO[PRIM]
Else ELO[ANT] ß ELO[PTEMP]
5. [Devolver o nodo eliminado à pilha de disponíveis]
ELO[PTEMP] ß DISP
DISP ß PTEMP
Return

Vous aimerez peut-être aussi