A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

UNIVERSIDADE FEDERAL DE MINAS GERAIS Pilhas e Filas Cristiano Arbex Valle Vinicius Fernandes dos Santos

Apresentações semelhantes


Apresentação em tema: "UNIVERSIDADE FEDERAL DE MINAS GERAIS Pilhas e Filas Cristiano Arbex Valle Vinicius Fernandes dos Santos"— Transcrição da apresentação:

1 UNIVERSIDADE FEDERAL DE MINAS GERAIS Pilhas e Filas Cristiano Arbex Valle arbex@dcc.ufmg.br Vinicius Fernandes dos Santos viniciussantos@dcc.ufmg.br

2 COMPUTER SCIENCE TAD Pilha TAD com a seguinte característica: – O último elemento a ser inserido é o primeiro a ser retirado (LIFO – Last In First Out) Analogia: pilha de pratos, livros, etc. Usos: chamada de subprogramas, avaliação de expressões aritméticas, etc…

3 COMPUTER SCIENCE TAD Pilha: Operações FPVazia(Pilha): Faz a pilha ficar vazia Vazia(Pilha): Retorna true se a pilha está vazia; caso contrário, retorna false Empilha(x, Pilha): Insere o item x no topo da pilha Desempilha(Pilha, x): Retorna o item x no topo da pilha, retirando-o da pilha Tamanho(Pilha): Esta função retorna o número de itens da pilha

4 COMPUTER SCIENCE TAD Pilha: Implementações Existem várias opções de estruturas de dados que podem ser usadas para representar pilhas As duas representações mais utilizadas são as implementações por meio de arranjos e de apontadores

5 COMPUTER SCIENCE Pilha: Impl. com Arranjos Os itens da pilha são armazenados em posições contíguas de memória Como as inserções e as retiradas ocorrem no topo da pilha, um cursor chamado Topo é utilizado para denotar a primeira posição disponível no topo da pilha

6 COMPUTER SCIENCE Pilha: Impl. com Arranjos #define MAX 1000 typedef int Apontador; typedef int TChave; typedef struct { TChave Chave; // outros componentes } TItem; typedef struct { TItem Item[MAX]; Apontador Topo; } TPilha;

7 COMPUTER SCIENCE Pilha: Impl. com Arranjos void FPVazia(TPilha *Pilha) { Pilha->Topo = 0; } int Vazia(TPilha Pilha) { return (Pilha.Topo == 0); }

8 COMPUTER SCIENCE Pilha: Impl. com Arranjos void Empilha(TItem x, TPilha *Pilha) { if (Pilha->Topo == MAX) printf("Erro: pilha cheia\n"); else { Pilha->Item[Pilha->Topo] = x; Pilha->Topo++; }

9 COMPUTER SCIENCE Pilha: Impl. com Arranjos void Desempilha(TPilha *Pilha, TItem *Item) { if (Vazia(*Pilha)) printf("Erro: pilha vazia\n"); else { *Item = Pilha->Item[Pilha->Topo - 1]; Pilha->Topo--; }

10 COMPUTER SCIENCE Pilha: Impl. com Arranjos int Tamanho(TPilha Pilha) { return Pilha.Topo; }

11 COMPUTER SCIENCE Pilha: Impl. com Apontadores Há uma célula cabeça no topo para facilitar a implementação das operações empilha e desempilha quando a pilha está vazia Para desempilhar o item x n basta desligar a célula cabeça da lista e a célula que contém x n passa a ser a célula cabeça Para empilhar um novo item, basta fazer a operação contrária, criando uma nova célula cabeça e colocando o novo item na antiga

12 COMPUTER SCIENCE Pilha: Impl. com Apontadores O campo Tamanho evita a contagem do número de itens na função Tamanho Cada célula de uma pilha contém um item da pilha e um apontador para outra célula O registro TPilha contém um apontador para o topo da pilha (célula cabeça) e um apontador para o fundo da pilha

13 COMPUTER SCIENCE Pilha: Impl. com Apontadores typedef int TChave; typedef struct { TChave Chave; // outros componentes } TItem; typedef struct Celula *Apontador; typedef struct Celula { TItem Item; Apontador Prox; } TCelula; typedef struct { Apontador Fundo; Apontador Topo; int Tamanho; } TPilha;

14 COMPUTER SCIENCE Pilha: Impl. com Apontadores void FPVazia(TPilha *Pilha) { Pilha->Topo = malloc(sizeof(TCelula)); Pilha->Fundo = Pilha->Topo; Pilha->Topo->Prox = NULL; Pilha->Tamanho = 0; } ? “Cabeça” Fundo Topo NULL

15 COMPUTER SCIENCE Pilha: Impl. com Apontadores int Vazia(TPilha Pilha) { return (Pilha.Topo == Pilha.Fundo); } ? “Cabeça” Fundo Topo NULL

16 COMPUTER SCIENCE Pilha: Impl. com Apontadores void Empilha(TItem x, TPilha *Pilha) { Apontador Aux = malloc(sizeof(TCelula)); Pilha->Topo->Item = x; Aux->Prox = Pilha->Topo; Pilha->Topo = Aux; Pilha->Tamanho++; } prox info prox info prox info NULL FundoTopo

17 COMPUTER SCIENCE Pilha: Impl. com Apontadores void Empilha(TItem x, TPilha *Pilha) { Apontador Aux = malloc(sizeof(TCelula)); Pilha->Topo->Item = x; Aux->Prox = Pilha->Topo; Pilha->Topo = Aux; Pilha->Tamanho++; } prox? info prox info prox info NULL AuxFundoTopo

18 COMPUTER SCIENCE Pilha: Impl. com Apontadores void Empilha(TItem x, TPilha *Pilha) { Apontador Aux = malloc(sizeof(TCelula)); Pilha->Topo->Item = x; Aux->Prox = Pilha->Topo; Pilha->Topo = Aux; Pilha->Tamanho++; } x prox? info prox info prox info NULL AuxFundoTopo

19 COMPUTER SCIENCE Pilha: Impl. com Apontadores void Empilha(TItem x, TPilha *Pilha) { Apontador Aux = malloc(sizeof(TCelula)); Pilha->Topo->Item = x; Aux->Prox = Pilha->Topo; Pilha->Topo = Aux; Pilha->Tamanho++; } x prox info prox info prox info NULL AuxFundoTopo

20 COMPUTER SCIENCE Pilha: Impl. com Apontadores void Empilha(TItem x, TPilha *Pilha) { Apontador Aux = malloc(sizeof(TCelula)); Pilha->Topo->Item = x; Aux->Prox = Pilha->Topo; Pilha->Topo = Aux; Pilha->Tamanho++; } x prox info prox info prox info NULL TopoFundo

21 COMPUTER SCIENCE Pilha: Impl. com Apontadores void Desempilha(TPilha *Pilha, TItem *Item) { if (Vazia(*Pilha)) { printf("Erro lista vazia\n"); return; } Apontador q = Pilha->Topo; Pilha->Topo = q->Prox; *Item = q->Prox->Item; free(q); Pilha->Tamanho--; }

22 COMPUTER SCIENCE Pilha: Impl. com Apontadores void Desempilha(TPilha *Pilha, TItem *Item) {... Apontador q = Pilha->Topo; Pilha->Topo = q->Prox; *Item = q->Prox->Item; free(q); Pilha->Tamanho--; } x prox info prox info prox info NULL FundoTopo ? Item

23 COMPUTER SCIENCE Pilha: Impl. com Apontadores void Desempilha(TPilha *Pilha, TItem *Item) {... Apontador q = Pilha->Topo; Pilha->Topo = q->Prox; *Item = q->Prox->Item; free(q); Pilha->Tamanho--; } x prox info prox info prox info NULL FundoTopoq ? Item

24 COMPUTER SCIENCE Pilha: Impl. com Apontadores void Desempilha(TPilha *Pilha, TItem *Item) {... Apontador q = Pilha->Topo; Pilha->Topo = q->Prox; *Item = q->Prox->Item; free(q); Pilha->Tamanho--; } x prox info prox info prox info NULL FundoTopoq ? Item

25 COMPUTER SCIENCE Pilha: Impl. com Apontadores void Desempilha(TPilha *Pilha, TItem *Item) {... Apontador q = Pilha->Topo; Pilha->Topo = q->Prox; *Item = q->Prox->Item; free(q); Pilha->Tamanho--; } x prox info prox info prox info NULL FundoTopoq x Item

26 COMPUTER SCIENCE Pilha: Impl. com Apontadores void Desempilha(TPilha *Pilha, TItem *Item) {... Apontador q = Pilha->Topo; Pilha->Topo = q->Prox; *Item = q->Prox->Item; free(q); Pilha->Tamanho--; } x prox info prox info prox info NULL FundoTopo x Item

27 COMPUTER SCIENCE Pilha: Impl. com Apontadores int Tamanho(TPilha Pilha) { return Pilha.Tamanho; }

28 COMPUTER SCIENCE Pilha Busca em profundidade pode ser feita com pilhas (Depth-first search) – Dado um grafo, o algoritmo começa em um vértice raiz e explora tanto quanto puder cada um dos seus ramos. Chamado também de busca não informada

29 COMPUTER SCIENCE TAD Fila TAD com a seguinte característica: – O primeiro elemento a ser inserido é o primeiro a ser retirado (FIFO – First In First Out) Analogia: fila bancária, fila do cinema Usos: sistemas operacionais, incluindo fila de impressão, escalonamento de processos

30 COMPUTER SCIENCE TAD Fila: Operações FFVazia(Fila): Faz a fila ficar vazia Enfileira(x, Fila): Insere o item x no final da fila Desenfileira(Fila, x): Retorna o item x no início da fila, retirando-o da fila Vazia(Fila): Esta função retorna true se a fila está vazia; senão retorna false

31 COMPUTER SCIENCE Fila: Impl. com Arranjos Os itens são armazenados em posições contíguas de memória A operação Enfileira faz a parte de trás da fila expandir-se A operação Desenfileira faz a parte da frente da fila contrair-se A fila tende a caminhar pela memória do computador, ocupando espaço na parte de trás e descartando espaço na parte da frente

32 COMPUTER SCIENCE Fila: Impl. com Arranjos Com poucas inserções e retiradas, a fila vai ao encontro do limite do espaço da memória alocado para ela FrenteTras

33 COMPUTER SCIENCE Fila: Impl. com Arranjos Com poucas inserções e retiradas, a fila vai ao encontro do limite do espaço da memória alocado para ela FrenteTras

34 COMPUTER SCIENCE Fila: Impl. com Arranjos Com poucas inserções e retiradas, a fila vai ao encontro do limite do espaço da memória alocado para ela FrenteTras

35 COMPUTER SCIENCE Fila: Impl. com Arranjos Com poucas inserções e retiradas, a fila vai ao encontro do limite do espaço da memória alocado para ela FrenteTras

36 COMPUTER SCIENCE Fila: Impl. com Arranjos Com poucas inserções e retiradas, a fila vai ao encontro do limite do espaço da memória alocado para ela FrenteTras

37 COMPUTER SCIENCE Fila: Impl. com Arranjos Com poucas inserções e retiradas, a fila vai ao encontro do limite do espaço da memória alocado para ela FrenteTras

38 COMPUTER SCIENCE Fila: Impl. com Arranjos Com poucas inserções e retiradas, a fila vai ao encontro do limite do espaço da memória alocado para ela FrenteTras

39 COMPUTER SCIENCE Fila: Impl. com Arranjos Com poucas inserções e retiradas, a fila vai ao encontro do limite do espaço da memória alocado para ela FrenteTras

40 COMPUTER SCIENCE Fila: Impl. com Arranjos Com poucas inserções e retiradas, a fila vai ao encontro do limite do espaço da memória alocado para ela FrenteTras

41 COMPUTER SCIENCE Fila: Impl. com Arranjos Solução: imaginar o array como um círculo. A primeira posição segue a última

42 COMPUTER SCIENCE Fila: Impl. com Arranjos A fila se encontra em posições contíguas de memória, em alguma posição do círculo, delimitada por apontadores – Frente: posição do primeiro elemento – Trás: primeira posição vazia Para enfileirar, basta mover o apontador Trás uma posição no sentido horário Para desenfileirar, basta mover o apontador Frente uma posição no sentido horário

43 COMPUTER SCIENCE Fila: Impl. com Arranjos Como incrementar os apontadores? – Frente = Frente + 1? – Tras = Tras + 1? FrenteTras 012345678

44 COMPUTER SCIENCE Fila: Impl. com Arranjos Como incrementar os apontadores? – Frente = (Frente + 1) % n – Tras = (Tras + 1) % n FrenteTras 012345678

45 COMPUTER SCIENCE Fila: Impl. com Arranjos Como incrementar os apontadores? – Frente = (Frente + 1) % n – Tras = (Tras + 1) % n FrenteTras 012345678

46 COMPUTER SCIENCE Fila: Impl. com Arranjos #define MAX 1000 typedef int Apontador; typedef int TChave; typedef struct { TChave Chave; // outros componentes } TItem; typedef struct { TItem Item[MAX]; Apontador Frente, Tras; } TFila;

47 COMPUTER SCIENCE Fila: Impl. com Arranjos void FFVazia(TFila *Fila) { Fila->Frente = 0; Fila->Tras = Fila->Frente; } int Vazia(TFila Fila) { return (Fila.Frente == Fila.Tras); }

48 COMPUTER SCIENCE Fila: Impl. com Arranjos Nos casos de fila cheia e fila vazia, os apontadores Frente e Trás normalmente apontariam para a mesma posição do círculo Uma saída para distinguir as duas situações é deixar uma posição vazia no array – vazia = (Frente == Tras) – cheia = ((Tras + 1) % MAX == Frente)

49 COMPUTER SCIENCE Fila: Impl. com Arranjos int Enfileira(TItem x, TFila *Fila) { if ((Fila->Tras + 1) % MAX == Fila->Frente) { printf("Erro: fila cheia\n"); return 0; } Fila->Item[Fila->Tras] = x; Fila->Tras = (Fila->Tras + 1) % MAX; return 1; }

50 COMPUTER SCIENCE Fila: Impl. com Arranjos int Desenfileira(TFila *Fila, TItem *Item) { if (Vazia(*Fila)) { printf("Erro: fila vazia\n"); return 0; } *Item = Fila->Item[Fila->Frente]; Fila->Frente = (Fila->Frente + 1) % MAX; return 1; }

51 COMPUTER SCIENCE Fila: Impl. com Apontadores Há uma célula cabeça para facilitar a implementação das operações Enfileira e Desenfileira quando a fila está vazia Quando a fila está vazia, os apontadores Frente e Trás apontam para a célula cabeça Para enfileirar um novo item, basta criar uma célula nova, ligá-la após a célula que contém x n e colocar nela o novo item Para desenfileirar o item x 1, basta desligar a célula cabeça da lista e a célula que contém x 1 passa a ser a célula cabeça

52 COMPUTER SCIENCE Fila: Impl. com Apontadores A fila é implementada por meio de células Cada célula contém um item da fila e um apontador para outra célula A estrutura TFila contém um apontador para a frente da fila (célula cabeça) e um apontador para a parte de trás da fila

53 COMPUTER SCIENCE Fila: Impl. com Apontadores typedef int TChave; typedef struct TItem { TChave Chave; // outros componentes } TItem; typedef struct Celula *Apontador; typedef struct Celula { TItem Item; Apontador Prox; } TCelula; typedef struct { Apontador Frente; Apontador Tras; } TFila;

54 COMPUTER SCIENCE Fila: Impl. com Apontadores void FFVazia(TFila *Fila) { Fila->Frente = malloc(sizeof(TCelula)); Fila->Tras = Fila->Frente; Fila->Frente->Prox = NULL; } ? “Cabeça” Tras Frente NULL

55 COMPUTER SCIENCE Fila: Impl. com Apontadores int Vazia(TFila Fila) { return (Fila.Frente == Fila.Tras); } ? “Cabeça” Tras Frente NULL

56 COMPUTER SCIENCE Fila: Impl. com Apontadores void Enfileira(TItem x, TFila *Fila) { Fila->Tras->Prox = malloc(sizeof(TCelula)); Fila->Tras = Fila->Tras->Prox; Fila->Tras->Item = x; Fila->Tras->Prox = NULL; } info prox info prox info NULL FrenteTras

57 COMPUTER SCIENCE Fila: Impl. com Apontadores void Enfileira(TItem x, TFila *Fila) { Fila->Tras->Prox = malloc(sizeof(TCelula)); Fila->Tras = Fila->Tras->Prox; Fila->Tras->Item = x; Fila->Tras->Prox = NULL; } info prox info prox info prox FrenteTras ?

58 COMPUTER SCIENCE Fila: Impl. com Apontadores void Enfileira(TItem x, TFila *Fila) { Fila->Tras->Prox = malloc(sizeof(TCelula)); Fila->Tras = Fila->Tras->Prox; Fila->Tras->Item = x; Fila->Tras->Prox = NULL; } info prox info prox info prox FrenteTras ?

59 COMPUTER SCIENCE Fila: Impl. com Apontadores void Enfileira(TItem x, TFila *Fila) { Fila->Tras->Prox = malloc(sizeof(TCelula)); Fila->Tras = Fila->Tras->Prox; Fila->Tras->Item = x; Fila->Tras->Prox = NULL; } info prox info prox info prox FrenteTras x NULL

60 COMPUTER SCIENCE Fila: Impl. com Apontadores void Desenfileira(TFila *Fila, TItem *Item) { if (Vazia(*Fila)) { printf("Erro: fila vazia\n"); return; } Apontador q = Fila->Frente; Fila->Frente = Fila->Frente->Prox; *Item = Fila->Frente->Item; free(q); }

61 COMPUTER SCIENCE Fila: Impl. com Apontadores void Desenfileira(TFila *Fila, TItem *Item) {... Apontador q = Fila->Frente; Fila->Frente = Fila->Frente->Prox; *Item = Fila->Frente->Item; free(q); } x prox info prox info NULL FrenteTras info prox ? Item

62 COMPUTER SCIENCE Fila: Impl. com Apontadores void Desenfileira(TFila *Fila, TItem *Item) {... Apontador q = Fila->Frente; Fila->Frente = Fila->Frente->Prox; *Item = Fila->Frente->Item; free(q); } x prox info prox info NULL FrenteTras info prox ? Item q

63 COMPUTER SCIENCE Fila: Impl. com Apontadores void Desenfileira(TFila *Fila, TItem *Item) {... Apontador q = Fila->Frente; Fila->Frente = Fila->Frente->Prox; *Item = Fila->Frente->Item; free(q); } x prox info prox info NULL FrenteTras info prox ? Item q

64 COMPUTER SCIENCE Fila: Impl. com Apontadores void Desenfileira(TFila *Fila, TItem *Item) {... Apontador q = Fila->Frente; Fila->Frente = Fila->Frente->Prox; *Item = Fila->Frente->Item; free(q); } x prox info prox info NULL FrenteTras info prox x Item q

65 COMPUTER SCIENCE Fila: Impl. com Apontadores void Desenfileira(TFila *Fila, TItem *Item) {... Apontador q = Fila->Frente; Fila->Frente = Fila->Frente->Prox; *Item = Fila->Frente->Item; free(q); } x prox info prox info NULL FrenteTras info prox x Item

66 COMPUTER SCIENCE Sumário Lista – Insere e remove em qualquer posição Pilha (FILO – First In Last Out) – Insere no topo, remove do topo Fila (FIFO – First In First Out) – Insere no fundo, remove da frente


Carregar ppt "UNIVERSIDADE FEDERAL DE MINAS GERAIS Pilhas e Filas Cristiano Arbex Valle Vinicius Fernandes dos Santos"

Apresentações semelhantes


Anúncios Google