Algoritmos e Estruturas de Dados
-
Upload
lilah-melendez -
Category
Documents
-
view
38 -
download
1
description
Transcript of Algoritmos e Estruturas de Dados
Pilhas e FilasPilhas e FilasPilhas e FilasPilhas e Filas
Pilhas e filas são casos especiais das listas Pilhas e filas são casos especiais das listas encadeadas.encadeadas.
Ambas possuem regras rigorosas para Ambas possuem regras rigorosas para acessar os dados armazenados nelas.acessar os dados armazenados nelas.
As operações de recuperação de dados As operações de recuperação de dados são destrutivas, ou seja, para se alcançar são destrutivas, ou seja, para se alcançar dados intermediários a tais estruturas, é dados intermediários a tais estruturas, é necessário destruir sequencialmente os necessário destruir sequencialmente os dados anteriores.dados anteriores.
PilhasPilhasPilhasPilhas
É uma das estruturas de dados mais simplesÉ uma das estruturas de dados mais simples
É a estrutura de dados mais utilizada em É a estrutura de dados mais utilizada em programação, sendo inclusive implementada programação, sendo inclusive implementada diretamente pelo hardware da maioria das diretamente pelo hardware da maioria das máquinas modernas.máquinas modernas.
A idéia fundamental da pilha é que todo o acesso A idéia fundamental da pilha é que todo o acesso a seus elementos é feito através do seu topo. a seus elementos é feito através do seu topo.
Assim, quando um elemento novo é introduzido Assim, quando um elemento novo é introduzido na pilha, passa a ser o elemento do topo, e o na pilha, passa a ser o elemento do topo, e o único elemento que pode ser removido da pilha é único elemento que pode ser removido da pilha é o do topo.o do topo.
PilhasPilhas:: Aplicações:: AplicaçõesPilhasPilhas:: Aplicações:: Aplicações
Verificação de parênteses.Verificação de parênteses.
Retirada de vagões de um trem.Retirada de vagões de um trem.
Retirada de mercadorias em um caminhão Retirada de mercadorias em um caminhão de entregas.de entregas.
Conversão de um número na base 10 para Conversão de um número na base 10 para outra base numérica.outra base numérica.
PilhasPilhasPilhasPilhas
Os elementos da pilha são retirados na Os elementos da pilha são retirados na ordem inversa à ordem em que foram ordem inversa à ordem em que foram introduzidos: o primeiro que sai é o último introduzidos: o primeiro que sai é o último que entrou (LIFO – last in, first out).que entrou (LIFO – last in, first out).
Existem duas operações básicas que Existem duas operações básicas que devem ser implementadas numa estrutura devem ser implementadas numa estrutura de pilha: de pilha: operação para operação para empilharempilhar ( (pushpush) um novo ) um novo
elemento, inserindo-o no topo, elemento, inserindo-o no topo,
operação para operação para desempilhardesempilhar ( (poppop) um ) um elemento, removendo-o do topoelemento, removendo-o do topo
PilhasPilhas:: :: PushPushPilhasPilhas:: :: PushPush
topo
push(a)push(a)
k
m
x
a
push(b)push(b)
b
PilhasPilhas:: :: PushPushPilhasPilhas:: :: PushPush
topo
k
m
x
topo
k
m
x
a
topo
k
m
x
a
b
push(a) push(b)
PilhasPilhas:: :: PopPopPilhasPilhas:: :: PopPop
topo
pop(b)pop(b)
k
m
x
a
pop(a)pop(a)
b
PilhasPilhas:: :: PopPopPilhasPilhas:: :: PopPop
k
m
x
topo
topo
k
m
x
topo
k
m
x
aa
b
pop(b) pop(a)
PilhasPilhas:: Implementação de pilha usando vetor:: Implementação de pilha usando vetorPilhasPilhas:: Implementação de pilha usando vetor:: Implementação de pilha usando vetor
Supondo a pilha está armazenada em um Supondo a pilha está armazenada em um vetor pilha[0..n-1]. vetor pilha[0..n-1].
Considerando que os elementos são Considerando que os elementos são inteiros (isso é só um exemplo, os inteiros (isso é só um exemplo, os elementos de pilha poderiam ser elementos de pilha poderiam ser quaisquer outros objetos). quaisquer outros objetos).
A parte do vetor ocupada pela pilha será:A parte do vetor ocupada pela pilha será:
00 tt n-1n-1
pilha[0..n-1]pilha[0..n-1]
PilhasPilhas:: Implementação de pilha usando vetor:: Implementação de pilha usando vetorPilhasPilhas:: Implementação de pilha usando vetor:: Implementação de pilha usando vetor
#define MAX 50
struct pilha {int n;int vet[MAX];
} tipoPilha;
#define MAX 50
struct pilha {int n;int vet[MAX];
} tipoPilha;
173172
PilhasPilhas:: Implementação de pilha usando :: Implementação de pilha usando estruturasestruturas
PilhasPilhas:: Implementação de pilha usando :: Implementação de pilha usando estruturasestruturas
typedef struct noh { float info; struct no *prox;} tipoNo;
struct pilha {tipoNo* topo;
} tipoPilha;
typedef struct noh { float info; struct no *prox;} tipoNo;
struct pilha {tipoNo* topo;
} tipoPilha;
PilhasPilhas:: Operações básicas:: Operações básicasPilhasPilhas:: Operações básicas:: Operações básicas
Criar uma estrutura de pilha;Criar uma estrutura de pilha;
Inserir um elemento no topo (push);Inserir um elemento no topo (push);
Remover o elemento do topo (pop);Remover o elemento do topo (pop);
Verificar se a pilha está vazia;Verificar se a pilha está vazia;
Liberar a estrutura de pilhaLiberar a estrutura de pilha
PilhasPilhas:: Criar uma estrutura de pilha:: Criar uma estrutura de pilhaPilhasPilhas:: Criar uma estrutura de pilha:: Criar uma estrutura de pilha
tipoPilha* criar(void){
tipoPilha *p;p = (tipoPilha*) malloc(sizeof(tipoPilha));p->topo = NULL;return p;
}
tipoPilha* criar(void){
tipoPilha *p;p = (tipoPilha*) malloc(sizeof(tipoPilha));p->topo = NULL;return p;
}
PilhasPilhas:: Inserir o elemento do topo - :: Inserir o elemento do topo - push()push()PilhasPilhas:: Inserir o elemento do topo - :: Inserir o elemento do topo - push()push()
tipoPilha push(tipoPilha *p, float v){
tipoNo* aux;aux = (tipoNo) malloc(sizeof(tipoNo));aux -> info = v;aux -> prox = p->topo;return aux;
}
tipoPilha push(tipoPilha *p, float v){
tipoNo* aux;aux = (tipoNo) malloc(sizeof(tipoNo));aux -> info = v;aux -> prox = p->topo;return aux;
}
PilhasPilhas:: Remover o elemento do topo - :: Remover o elemento do topo - pop()pop()PilhasPilhas:: Remover o elemento do topo - :: Remover o elemento do topo - pop()pop()
void pop(tipoPilha *p){
float v;tipoNo* aux;if (vazia(p)) {
printf(“Pilha vazia.”);exit(1); /*aborta o programa*/
}v = p->topo->info;aux = p->prox;free(p);printf(“Retirou o elemento %d”, v);
}
void pop(tipoPilha *p){
float v;tipoNo* aux;if (vazia(p)) {
printf(“Pilha vazia.”);exit(1); /*aborta o programa*/
}v = p->topo->info;aux = p->prox;free(p);printf(“Retirou o elemento %d”, v);
}
PilhasPilhas:: Verificar se a pilha está vazia:: Verificar se a pilha está vaziaPilhasPilhas:: Verificar se a pilha está vazia:: Verificar se a pilha está vazia
int vazia(tipoPilha *p){
return (p->topo == NULL);}
int vazia(tipoPilha *p){
return (p->topo == NULL);}
PilhasPilhas:: Liberar a estrutura de pilha:: Liberar a estrutura de pilhaPilhasPilhas:: Liberar a estrutura de pilha:: Liberar a estrutura de pilha
void libera(tipoPilha *p){
tipoNo* q = p->topo;while (q != NULL){
tipoNo *t = q->prox;free(q);q = t;
}free(p);
}
void libera(tipoPilha *p){
tipoNo* q = p->topo;while (q != NULL){
tipoNo *t = q->prox;free(q);q = t;
}free(p);
}
174
FilasFilasFilasFilas
São São listas lineares listas lineares que adotam a política que adotam a política FIFOFIFO (First In First Out – o primeiro que entra é o (First In First Out – o primeiro que entra é o primeiro que sai) para a manipulação de primeiro que sai) para a manipulação de elementos.elementos.
As inserções são feitas no final da fila.As inserções são feitas no final da fila.
As remoções são feitas no início da fila.As remoções são feitas no início da fila.
A consulta na fila é feita desenfileirando A consulta na fila é feita desenfileirando elemento a elemento até encontrar o elemento elemento a elemento até encontrar o elemento desejado ou chegar ao final da fila.desejado ou chegar ao final da fila.
FilasFilas:: Aplicações:: AplicaçõesFilasFilas:: Aplicações:: Aplicações
Alocação de recursos para impressão de Alocação de recursos para impressão de documentos em uma impressora (spooler documentos em uma impressora (spooler de impressão).de impressão).
Atendimento de processos requisitados ao Atendimento de processos requisitados ao um sistema operacional.um sistema operacional.
Ordenação do encaminhamento dos Ordenação do encaminhamento dos pacotes em um roteador.pacotes em um roteador.
Buffer para gravação de dados em mídia.Buffer para gravação de dados em mídia.
FilasFilas:: Aplicações:: AplicaçõesFilasFilas:: Aplicações:: Aplicações
fila para pouso
fila para decolagem
Filas de tamanho variávelFilas de tamanho variável:: Inserção:: InserçãoFilas de tamanho variávelFilas de tamanho variável:: Inserção:: Inserção
bb aa xx mm kk
xx mm kk
aa xx mm kk
aa
bb
Filas de tamanho variávelFilas de tamanho variável:: Remoção:: RemoçãoFilas de tamanho variávelFilas de tamanho variável:: Remoção:: Remoção
bb aa xx mm kk
xx mm kk
aa xx mm kk
kk
mm
Filas de tamanho fixoFilas de tamanho fixoFilas de tamanho fixoFilas de tamanho fixo
xx mm kk
aa xx mm
bb aa xx
aa kk
bb mm
FilasFilas:: Estrutura de uma fila:: Estrutura de uma filaFilasFilas:: Estrutura de uma fila:: Estrutura de uma fila
FilasFilas:: Operações básicas:: Operações básicasFilasFilas:: Operações básicas:: Operações básicas
CriaçãoCriação
DestruiçãoDestruição
Inserção de um elementoInserção de um elemento
Remoção de um elementoRemoção de um elemento
Localização de um elemento para consulta ou Localização de um elemento para consulta ou alteração alteração
Ordenação de uma listaOrdenação de uma lista
Intercalação de duas listasIntercalação de duas listas
Concatenação de duas listasConcatenação de duas listas
Divisão de uma lista em duasDivisão de uma lista em duas
FilasFilas:: Criação de uma fila:: Criação de uma filaFilasFilas:: Criação de uma fila:: Criação de uma fila
typedef struct { int info; /* outros componentes*/} tipoItem;
typedef struct no { tipoItem item; struct no *prox;} tipoNo;
typedef struct { tipoNoh frente;
tipoNoh tras;} tipoFila;
typedef struct { int info; /* outros componentes*/} tipoItem;
typedef struct no { tipoItem item; struct no *prox;} tipoNo;
typedef struct { tipoNoh frente;
tipoNoh tras;} tipoFila;
FilasFilas:: Inserção de um elemento:: Inserção de um elementoFilasFilas:: Inserção de um elemento:: Inserção de um elemento
void ffvazia(tipoFila *fila) { fila->frente = (tipoNo) malloc(sizeof(tipoNo)); fila->tras = fila->frente; fila->frente->prox = NULL;}
int vazia(tipoFila fila) { return (fila.frente == fila.tras);}
void enfileira(tipoItem x, tipoFila *fila) { fila->tras->prox = (tipoNo) malloc(sizeof(tipoNo)); fila->tras = fila->tras->prox; fila->tras->item = x; fila->tras->prox = NULL;}
void ffvazia(tipoFila *fila) { fila->frente = (tipoNo) malloc(sizeof(tipoNo)); fila->tras = fila->frente; fila->frente->prox = NULL;}
int vazia(tipoFila fila) { return (fila.frente == fila.tras);}
void enfileira(tipoItem x, tipoFila *fila) { fila->tras->prox = (tipoNo) malloc(sizeof(tipoNo)); fila->tras = fila->tras->prox; fila->tras->item = x; fila->tras->prox = NULL;}
FilasFilas:: Remoção de um elemento:: Remoção de um elementoFilasFilas:: Remoção de um elemento:: Remoção de um elemento
void desenfileira(tipoFila *fila) { ptr p; if (vazia(*fila))
{ printf("Erro: Fila vazia.\n"); return;
} p = fila->frente; fila->frente = fila->frente->prox; free(p); printf("Item da fila excluido com sucesso."); getch();}
void desenfileira(tipoFila *fila) { ptr p; if (vazia(*fila))
{ printf("Erro: Fila vazia.\n"); return;
} p = fila->frente; fila->frente = fila->frente->prox; free(p); printf("Item da fila excluido com sucesso."); getch();}
175
QuestõesQuestõesQuestõesQuestões