Algoritmos e Estruturas de Dados Pilhas e Filas Prof. Me. Claudio Benossi [email protected].

30
Algoritmos e Estruturas de Dados Pilhas e Filas Pilhas e Filas Prof. Me. Claudio Benossi [email protected]

Transcript of Algoritmos e Estruturas de Dados Pilhas e Filas Prof. Me. Claudio Benossi [email protected].

Page 1: 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 [email protected]

Page 2: Algoritmos e Estruturas de Dados Pilhas e Filas Prof. Me. Claudio Benossi claudio@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.

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

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.

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

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.

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

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

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

PilhasPilhas:: :: PushPushPilhasPilhas:: :: PushPush

topo

push(a)push(a)

k

m

x

a

push(b)push(b)

b

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

PilhasPilhas:: :: PushPushPilhasPilhas:: :: PushPush

topo

k

m

x

topo

k

m

x

a

topo

k

m

x

a

b

push(a) push(b)

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

PilhasPilhas:: :: PopPopPilhasPilhas:: :: PopPop

topo

pop(b)pop(b)

k

m

x

a

pop(a)pop(a)

b

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

PilhasPilhas:: :: PopPopPilhasPilhas:: :: PopPop

k

m

x

topo

topo

k

m

x

topo

k

m

x

aa

b

pop(b) pop(a)

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

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]

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

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

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

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;

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

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

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

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;

}

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

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;

}

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

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);

}

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

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);}

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

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

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

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.

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

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.

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

FilasFilas:: Aplicações:: AplicaçõesFilasFilas:: Aplicações:: Aplicações

fila para pouso

fila para decolagem

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

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

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

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

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

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

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

FilasFilas:: Estrutura de uma fila:: Estrutura de uma filaFilasFilas:: Estrutura de uma fila:: Estrutura de uma fila

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

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

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

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;

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

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;}

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

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

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

QuestõesQuestõesQuestõesQuestões