Algoritmos e Estruturas de Dados Pilhas e Filas Prof. Me. Claudio Benossi claudio@beno.com.br.

Post on 18-Apr-2015

105 views 2 download

Transcript of Algoritmos e Estruturas de Dados Pilhas e Filas Prof. Me. Claudio Benossi claudio@beno.com.br.

Algoritmos e Estruturas de Dados

Pilhas e FilasPilhas e Filas

Prof. Me. Claudio Benossiclaudio@beno.com.br

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