Pilha e Fila Estática

4,682
-1

Published on

1 Comment
2 Likes
Statistics
Notes
No Downloads
Views
Total Views
4,682
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
222
Comments
1
Likes
2
Embeds 0
No embeds

No notes for slide

Pilha e Fila Estática

  1. 1. Fim Correia transporadora Pilha e Fila estática Prof. Sérgio Souza Costa Inicio
  2. 2. Sobre mim Sérgio Souza Costa Professor - UFMA Doutor em Computação Aplicada (INPE) prof.sergio.costa@gmail.com https://sites.google.com/site/profsergiocosta/home http://www.slideshare.net/skosta/presentations?order=popular https://twitter.com/profsergiocosta http://gplus.to/sergiosouzacosta
  3. 3. Pilhas Disciplina| Professor Um dos conceitos mais úteis na ciência da computação é o de pilha. Nesta aula, examinaremos essa simples estrutura de dados e verificaremos por que ela desempenha esse proeminente papel nas áreas de programação e de linguagens de programação. Esta aula pode ser vista também no vídeo abaixo:
  4. 4. Pilhas
  5. 5. Quais operações você pode fazer com pilhas ?
  6. 6. Quais operações você pode fazer com pilhas ? Empilhar
  7. 7. Quais operações você pode fazer com pilhas ? Empilhar No topo
  8. 8. Quais operações você pode fazer com pilhas ? Empilhar No topo Desempilhar
  9. 9. Quais operações você pode fazer com pilhas ? Empilhar No topo Desempilhar Do topo
  10. 10. Pilha: Conceito básico (1)
  11. 11. Pilha: Conceito básico empilha (1) (2)
  12. 12. Pilha: Conceito básico empilha empilha (1) (2) (3)
  13. 13. Pilha: Conceito básico empilha empilha empilha (1) (2) (3) (4)
  14. 14. Pilha: Conceito básico empilha empilha empilha (1) Desempilha (5) (2) (3) (4)
  15. 15. Pilha: Conceito básico empilha empilha empilha (1) (2) Desempilha empilha (5) (6) (3) (4)
  16. 16. Pilha: Conceito básico empilha empilha empilha (1) (2) Desempilha (3) Desempilha empilha (5) (6) (7) (4)
  17. 17. Pilha: Conceito básico empilha empilha empilha (1) (2) Desempilha (3) Desempilha empilha (5) (4) Desempilha (6) (7) (8)
  18. 18. Pilha: Conceito básico O primeiro que entra é o último que sai. LIFO (do inglês, Last In First Out) empilha empilha empilha . (1) (2) Desempilha (3) Desempilha empilha (5) (4) Desempilha (6) (7) (8)
  19. 19. O Tipo Abstrato Pilha
  20. 20. O Tipo Abstrato Pilha Ou seja, as operações que descrevem o comportamento da Pilha.
  21. 21. Quais seriam estas operações, vocês são capazes de enumerá-las ?
  22. 22. 1. Empilhar
  23. 23. 1. Empilhar 2. Desempilhar
  24. 24. 1. Empilhar 2. Desempilhar 3. Verificar o valor do topo
  25. 25. 1. Empilhar 2. Desempilhar 3. Verificar o valor do topo 4. Verificar se a pilha está vazia
  26. 26. 1. Empilhar 2. Desempilhar 3. Verificar o valor do topo 4. Verificar se a pilha está vazia 5. Cria uma Pilha
  27. 27. TAD: Pilha Significado das operações (P sendo uma pilha e x um elemento) 1.cria_pilha () - Inicializa uma pilha, retornando uma dada pilha P 2.empilha(P,x) - Acrescenta o elemento x no topo da pilha P (o tamanho de P aumenta) 3.desempilha (P) - Remove e retorna o elemento no topo da pilha (o tamanho de P diminui) 4.pilha_vazia (P) - Verifica se a pilha está vazia (ou seja, não possui nenhum elemento) 5.topo (P) – Retorna o valor que está no topo da pilha
  28. 28. Qual será o estado final da pilha após estas operações ? p = cria_pilha() empilha (p, 10) empilha (p, 20) empilha (p, 30) desempilha (p) empilha (p,50) desempilha (p) desempilha (p) empilha (p,90)
  29. 29. p p = cria_pilha () empilha (p, 10) empilha (p, 20) empilha (p, 30) desempilha (p) empilha (p,50) desempilha (p) desempilha (p) empilha (p,90)
  30. 30. 10 p p p = cria_pilha () empilha (p, 10) empilha (p, 20) empilha (p, 30) desempilha (p) empilha (p,50) desempilha (p) desempilha (p) empilha (p,90)
  31. 31. 20 10 p 10 p p p = cria_pilha () empilha (p, 10) empilha (p, 20) empilha (p, 30) desempilha (p) empilha (p,50) desempilha (p) desempilha (p) empilha (p,90)
  32. 32. 30 20 10 p 20 10 10 p p p p = cria_pilha () empilha (p, 10) empilha (p, 20) empilha (p, 30) desempilha (p) empilha (p,50) desempilha (p) desempilha (p) empilha (p,90)
  33. 33. 30 20 20 10 p 20 10 10 10 p p p p p = cria_pilha () empilha (p, 10) empilha (p, 20) empilha (p, 30) desempilha (p) empilha (p,50) desempilha (p) desempilha (p) empilha (p,90)
  34. 34. 30 20 50 20 10 p 20 10 p 20 10 10 10 p p p p p = cria_pilha () empilha (p, 10) empilha (p, 20) empilha (p, 30) desempilha (p) empilha (p,50) desempilha (p) desempilha (p) empilha (p,90)
  35. 35. 30 20 20 10 p 20 10 10 10 p p p p 50 20 20 10 10 p p p = cria_pilha () empilha (p, 10) empilha (p, 20) empilha (p, 30) desempilha (p) empilha (p,50) desempilha (p) desempilha (p) empilha (p,90)
  36. 36. 30 20 20 10 p 20 10 10 10 p p p p 50 20 20 10 10 10 p p p p = cria_pilha () empilha (p, 10) empilha (p, 20) empilha (p, 30) desempilha (p) empilha (p,50) desempilha (p) desempilha (p) empilha (p,90)
  37. 37. 30 20 20 10 p 20 10 10 10 p p p p 50 20 20 10 10 10 10 p p p p 90 p = cria_pilha () empilha (p, 10) empilha (p, 20) empilha (p, 30) desempilha (p) empilha (p,50) desempilha (p) desempilha (p) empilha (p,90)
  38. 38. 30 20 20 10 p 20 10 10 10 p p p p 50 20 20 10 10 10 10 p p p p 90 p = cria_pilha () empilha (p, 10) empilha (p, 20) empilha (p, 30) desempilha (p) empilha (p,50) desempilha (p) desempilha (p) empilha (p,90)
  39. 39. Entenderam o conceito da pilha ?
  40. 40. Como podemos codificar esta estrutura ?
  41. 41. Que elementos podemos usar ?
  42. 42. Vídeo Aula Esta aula pode ser vista também no vídeo abaixo:
  43. 43. TAD: Pilha Uma possibilidade é usar vetores, dados que estes permitem armazenar uma coleção de dados.
  44. 44. TAD: Pilha Uma possibilidade é usar vetores, dados que estes permitem armazenar uma coleção de dados. Uma pilha que usa vetor como estrutura básica é chamada de pilha estática.
  45. 45. TAD: Pilha Uma possibilidade é usar vetores, dados que estes permitem armazenar uma coleção de dados. Uma pilha que usa vetor como estrutura básica é chamada de pilha estática. Na Unidade II, veremos como codificar uma pilha dinâmica usando listas encadeadas.
  46. 46. Codificando o TAD Pilha •Antes de prosseguir, pause a aula e tentem rascunhar em papel como seria as operações: –Empilha e –Desempilha
  47. 47. Codificando o TAD Pilha •Ao usar um vetor como estrutura para a nossa pilha precisamos: –Saber em qual posição do vetor o elemento deve ser empilhado. –Saber quando a pilha encheu, ou seja, precisaremos de uma operação que verifica se a pilha encheu.
  48. 48. Codificando o TAD Pilha •O que vamos precisar para codificar a nossa pilha?
  49. 49. Codificando o TAD Pilha •O que vamos precisar para codificar a nossa pilha? Registros
  50. 50. Codificando o TAD Pilha •O que vamos precisar para codificar a nossa pilha? Registros Funções
  51. 51. Codificando o TAD Pilha •O que vamos precisar para codificar a nossa pilha? Registros Funções Ponteiros
  52. 52. Codificando o TAD Pilha •O que vamos precisar para codificar a nossa pilha? Registros Funções Alocação Dinâmica Ponteiros
  53. 53. Codificando o TAD Pilha Criando o tipo de dado Pilha ... typedef struct } Pilha; { Esta é a sintaxe básica para criar qualquer tipo de dado. Mas o que uma pilha irá ter ? .
  54. 54. Codificando o TAD Pilha Criando o tipo de dado Pilha ... typedef struct int v[10]; } Pilha; { Um vetor v com um dado tamanho para armazenar os dados.
  55. 55. Codificando o TAD Pilha Criando o tipo de dado Pilha ... #define MAX 10 typedef struct { int v[MAX]; } Pilha; Porém, usamos uma constante para definir o tamanho do vetor. Por que ?
  56. 56. Codificando o TAD Pilha Criando o tipo de dado Pilha ... #define MAX 10 typedef struct { int v[MAX]; int topo; } Pilha; Precisamos ainda saber em qual posicão inserir, para isso usamos o atributo topo
  57. 57. Codificando o TAD Pilha Codificando as operações: Pilha* criaPilha (){ Pilha* p = (Pilha*) malloc (sizeof(Pilha)); p->topo = 0; return p; }
  58. 58. Codificando o TAD Pilha Codificando as operações: // verifica se a pilha está cheia int pilhaCheia (Pilha *p) { return (p->topo == MAX); } // verifica se está vazia int pilhaVazia (Pilha* p) { return p->topo == 0; }
  59. 59. Codificando o TAD Pilha Codificando as operações: void empilha (Pilha *p, int x) { p->v[p->topo++] = x; } int desempilha (Pilha* p) { return p->v[--p->topo]; } // retorna o elemento do topo, sem desempilhar int topo (Pilha* p) { return p->v[p->topo-1]; }
  60. 60. Codificando o TAD Pilha Codificando as operações: void empilha (Pilha *p, int x) { p->v[p->topo++] = x; } int desempilha (Pilha* p) { return p->v[--p->topo]; } // retorna o elemento do topo, sem desempilhar int topo (Pilha* p) { return p->v[p->topo-1]; }
  61. 61. Codificando o TAD Pilha Codificando as operações: void empilha (Pilha *p, int x) { void empilha (Pilha *p, int x) { p->v[p->topo] = x; p->v[p->topo++] = x; p->topo++; } } int desempilha (Pilha* p) { return p->v[--p->topo]; } // retorna o elemento do topo, sem desempilhar int topo (Pilha* p) { return p->v[p->topo-1]; }
  62. 62. Codificando o TAD Pilha Codificando as operações: void empilha (Pilha *p, int x) { p->v[p->topo++] = x; } int desempilha (Pilha* p) { return p->v[--p->topo]; } // retorna o elemento do topo, sem desempilhar int topo (Pilha* p) { return p->v[p->topo-1]; }
  63. 63. Codificando o TAD Pilha Codificando as operações: void empilha (Pilha *p, int x) { p->v[p->topo++] = x; } void desempilha (Pilha *) { p->topo--; int desempilhareturn p->v[p->topo]; (Pilha* p) { return p->v[--p->topo]; } } // retorna o elemento do topo, sem desempilhar int topo (Pilha* p) { return p->v[p->topo-1]; }
  64. 64. Codificando o TAD Pilha Codificando as operações: void empilha (Pilha *p, int x) { p->v[p->topo++] = x; } int desempilha (Pilha* p) { return p->v[--p->topo]; } // retorna o elemento do topo, sem desempilhar int topo (Pilha* p) { return p->v[p->topo-1]; }
  65. 65. Codificando o TAD Pilha •Aplicação Cliente: Testando nossa pilha: – O que será impresso ? int main () { Pilha* p = criaPilha (); empilha (p, 10); empilha (p, 30); empilha (p, 40); printf ("%dn", desempilha (p)); printf ("%dn", desempilha (p)); printf ("%dn", desempilha (p)); }
  66. 66. APLICAÇÕES
  67. 67. Aplicações •Como o uso das pilhas é possivel simplificar diversos algoritmos. –O próprio sistema operacional utiliza pilha para tratar as chamadas a funções. –Uma outra aplicação comum é na avaliação de expressões e de parênteses.
  68. 68. Identificando palíndromos • Palíndromos são palavras ou frases que são iguais quando lidas de frente para trás • Exemplos: ANA ARARA ROTOR SOCORRAM ME SUBI NO ONIBUS EM MARROCOS (não considerando os espaços em branco)
  69. 69. Identificando palíndromos • Algoritmo 1. Empilhe n/2 letras 2. Descarta letra central se houver 3. Repita 1. Compare o topo da pilha com a proxima letra 2. Se são iguais entao Desempilhe 3. Senao Não é um palíndromo 4. Se no final a pilha está vazia entao a palavra é um palíndromo
  70. 70. Identificando palíndromos ARARA Topo =0 Base =1 1 2 3 4 5 6 7 8
  71. 71. Identificando palíndromos ARARA Topo =1 Base =1 A 1 2 3 4 5 Empilha letra 1 6 7 8
  72. 72. Identificando palíndromos ARARA Topo =2 Base =1 AR 1 2 3 4 5 Empilha letra 2 6 7 8
  73. 73. Identificando palíndromos ARARA Topo =2 Base =1 AR 1 2 3 4 5 6 Descarta letra central 7 8
  74. 74. Identificando palíndromos ARARA Topo =2 Base =1 AR 1 2 3 4 5 6 7 Comparar topo com próxima letra 8
  75. 75. Identificando palíndromos ARARA Topo =1 Base =1 A 1 2 3 4 5 6 7 Se são iguais então desempilhe 8
  76. 76. Identificando palíndromos ARARA Topo =1 Base =1 A 1 2 3 4 5 6 7 Comparar topo com próxima letra 8
  77. 77. Identificando palíndromos ARARA Topo =1 Base =1 1 2 3 4 5 6 7 Se são iguais então desempilhe 8
  78. 78. Identificando palíndromos ARARA Topo =1 Base =1 1 2 3 4 5 6 7 8 Se no final a pilha está vazia então é um palíndromo
  79. 79. Outros exemplos •Pilhas podem ser utilizadas para verificar se os parênteses em uma expressão está balanceado. Exemplo: ((3+4 + (4*9) ERRO: Faltam dois parênteses fechando! Como?
  80. 80. Outros exemplos •Pilhas podem ser utilizadas para verificar se os parênteses em uma expressão está balanceado. Exemplo: ((3+4 + (4*9) ERRO: Faltam dois parênteses fechando! Como? Para cada carácter da expressão faça •Se encontrou um “(“ empilha •Se encontrou um “)” então •Se a pilha estiver vazia: expressão invalida •Caso contrario desempilhe • Se no final pilha estiver vazia, expressão válida.
  81. 81. Notação Infixa - Avaliação Operadores entre operandos. 4+6*8 Como decidir quais operadores são avaliados primeiros ? oAbordagem usual é usar as mesmas regras da matemática. oCaso a precedênciaseja a mesma, avalia-se da esquerda para direita oParenteses tem precedência sobre todos operadores.
  82. 82. Notação Polonesa É fácil observar que devido a estas regras, o algoritmo para avaliar expressões na notação infixa não é muito trivial. O matemático polonês Jan Łukasiewicz criou uma notação em torno de 1920 que elimina a necessidade de regras. Ficou sendo conhecida como notação polonesa. Não é muito usado na matemática convencional, mas muito usado nas ciências da computação devido sua simplicidade.
  83. 83. Avaliação de expressões - Notações Infixa: A + (B*C) / D Posfixa (polonesa reversa): A B C * + D / Préfixa (polonesa): + A / * B C D
  84. 84. Avaliação de expressões - Notações Infixa: A + (B*C) / D Posfixa (polonesa reversa): A B C * + D / Préfixa (polonesa): + A / * B C D
  85. 85. Exemplos de uso da notação polonesa Linguagens: Scheme e Lisp
  86. 86. Algoritmo de avaliação de expressão na notação posfixa.
  87. 87. Notação Posfixa A avaliação de expressões nesta notação é a mais simples. Percorrendo uma expressão da esquerda para direita, sabemos que ele deve operar os dois últimos valores encontrados (considerando que os operadores são binários, por exemplo os aritméticos).
  88. 88. Notação posfixa Considerem a seguinte expressão 7 3 + 5 * Expressão 73+5* 3+5* +5* Elemento Ação 7 3 Empilhar Empilhar Pilha P:[] P:[7] P:[3,7] 5* + * 5 Desempilha 3 Desempilha 7 Empilha 3+7 Empilhar P:[7] P:[] P:[10] P:[5,10] * Desempilha 5 P:[10] Desempilha 10 P:[] Empilha 5*10 P:[50] Se a pilha tiver mais de um elemento, erro, caso contrário retorna o único valor da pilha.
  89. 89. Referências Bibliográficas •AARON, Tanenbaun. Estruturas de Dados usando C. São Paulo: Makron Books, 1995. •PEREIRA, Silvio. Estruturas de Dados Fundamentais. São Paulo: Editora Erica, 1996. •VELOSO, Paulo et al. Estruturas de Dados. Rio de Janeiro: Editora Campus, 1983.
  90. 90. Vídeo Aula Esta aula pode ser vista também no vídeo abaixo:
  91. 91. Fila: Conceito Conceito base: O primeiro a entrar é o primeiro a sair. Em Inglês (Fifo): First In Fist Out •Fila de banco •Fila de pacientes •Fila do supermercado
  92. 92. O Tipo Abstrato Fila
  93. 93. O Tipo Abstrato Fila Ou seja, as operações que descrevem o comportamento da Fila.
  94. 94. Quais seriam estas operações, são capazes de enumerá-las ?
  95. 95. 1. criarFila
  96. 96. 1. criarFila 2. enfileirar
  97. 97. 1. criarFila 2. enfileirar 3. desenfileirar
  98. 98. Como podemos codificar esta estrutura ?
  99. 99. Quais elementos podemos usar ?
  100. 100. TAD: Fila Novamente, uma possibilidade é usar vetores, dado que estes permitem armazenar uma coleção de dados. Uma fila que usa vetor como estrutura básica é chamada de fila estática. Na Unidade III, veremos como codificar uma fila dinâmica usando listas encadeadas.
  101. 101. Estava pensando, e observei que na pilha a entrada e saída é pelo mesmo “lado”. Porém na fila é diferente, quem chega vai para fim da fila e sai quem está no início da fila.
  102. 102. Imaginando, um trabalho em série, onde um conjunto de peças percorre uma correia até ela ir para empacotamento teríamos algo assim:
  103. 103. Fim Inicio Correia transporadora Empacotador
  104. 104. Quando chega um novo produto, ele é colocado no fim da fila. Fim Inicio Correia transporadora Empacotador
  105. 105. Quando um produto chega ao fim do processo, a peça anterior passa a ser o inicio da fila. Fim Inicio Correia transporadora Empacotador
  106. 106. Quando um produto chega ao fim do processo, a peça anterior passa a ser o inicio da fila. Fim Inicio Correia transporadora Empacotador
  107. 107. Quando chega um novo produto, ele é colocado no fim da fila. Fim Inicio Correia transporadora Empacotador
  108. 108. CODIFICANDO ...
  109. 109. TAD: Fila Definindo o tipo de dados Fila. Observe, que tivemos que incluir os dois atributos, que marcam o inicio e o fim da fila. typedef struct { int v[MAX]; int inicio, fim; }Fila;
  110. 110. TAD: Fila Codificando as operações: Fila* criaFila () { Fila* q = (Fila*) malloc (sizeof(Fila)); q->inicio = 0; q->fim = 0; return q; }
  111. 111. Antes de codificar vou pensar um pouco. Eu sei que quando eu enfileiro estarei incrementando o fim e quando eu desenfileiro eu incremento o inicio. Mas vou simular antes de codificar.
  112. 112. Considerando uma fila de no máximo 3 elementos: 2 1 fim 0 q Inicio Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  113. 113. Considerando uma fila de no máximo 3 elementos: 2 fim 1 0 10 q Inicio Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  114. 114. Considerando uma fila de no máximo 3 elementos: fim 2 1 20 0 10 q Inicio Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  115. 115. Considerando uma fila de no máximo 3 elementos: fim 2 30 1 20 0 10 q Inicio Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  116. 116. Considerando uma fila de no máximo 3 elementos: fim 2 30 1 20 Inicio 0 q 10 Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  117. 117. Considerando uma fila de no máximo 3 elementos: fim 2 30 Inicio 1 0 q 10 20 Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  118. 118. Considerando uma fila de no máximo 3 elementos: fim 2 30 Inicio 1 0 q 10 20 Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  119. 119. Considerando uma fila de no máximo 3 elementos: fim 2 30 Inicio 1 0 q Erro: Mesmo tendo áreas vagas, eu nao posso mais adicionar elemento. Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  120. 120. TAD: Fila Solução, vetor circular: Depois do último elemento, temos o primeiro e antes do primeiro temos o último. Fonte:http://www2.dc.ufscar.br/~bsi/materiais/ed/u5.html
  121. 121. Agora vou simular novamente, mas considerando meu vetor circular.
  122. 122. Considerando uma fila de no máximo 3 elementos: 2 1 fim 0 q Inicio Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  123. 123. Considerando uma fila de no máximo 3 elementos: 2 fim 1 0 10 q Inicio Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  124. 124. Considerando uma fila de no máximo 3 elementos: fim 2 1 20 0 10 q Inicio Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  125. 125. Considerando uma fila de no máximo 3 elementos: 2 30 1 20 0 10 q Inicio fim Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  126. 126. Considerando uma fila de no máximo 3 elementos: 2 30 1 20 Inicio 0 q 10 fim Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  127. 127. Considerando uma fila de no máximo 3 elementos: 2 30 Inicio 1 0 q 10 20 fim Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  128. 128. Considerando uma fila de no máximo 3 elementos: 2 30 Inicio 1 0 50 q 10 20 fim Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  129. 129. Considerando uma fila de no máximo 3 elementos: 2 30 1 60 0 50 q 10 20 Inicio fim Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  130. 130. Considerando uma fila de no máximo 3 elementos: 2 1 60 0 50 q 10 20 30 fim Inicio Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  131. 131. Considerando uma fila de no máximo 3 elementos: 2 1 60 0 q 10 20 30 50 fim Inicio Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  132. 132. Considerando uma fila de no máximo 3 elementos: 2 Inicio fim 1 0 q 10 20 30 50 60 Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  133. 133. Codificando as operações: void enfileira (Fila* q, int x) { q->v[q->fim++] = x; if (q->fim == MAX) q->fim = 0; }
  134. 134. TAD: Fila Codificando as operações: void enfileira (Fila* q, int x) { q->v[q->fim++] = x; if (q->fim == MAX) q->fim = 0; } Adicionamos ao fim da fila e incrementamos a variável fim.
  135. 135. TAD: Fila Codificando as operações: void enfileira (Fila* q, int x) { q->v[q->fim++] = x; if (q->fim == MAX) q->fim = 0; } Aqui simula o vetor circular. Se chega a MAX, então fim passa ser 0.
  136. 136. TAD: Fila Codificando as operações: int desenfileira(Fila* q) { int x = q->v[q->inicio++]; if (q->inicio == MAX) q->inicio = 0; return x; } Similar ao enfileira, com a diferença que irei remover o elemento do inicio da fila.
  137. 137. TAD: Fila Testando nossa codificação: int main () { Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 40); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); return 0; } O que será impresso ?
  138. 138. Exemplos de Aplicação
  139. 139. Fila: Aplicações •Em controle de processos operacional, fila de processos. no sistema •Em algoritmo de busca em grafo (busca em largura). •Algoritmo de caminho mínimo (Dijkstra). •Algoritmo de ordenação.
  140. 140. Referências Bibliográficas •AARON, Tanenbaun. Estruturas de Dados usando C. São Paulo: Makron Books, 1995. •PEREIRA, Silvio. Estruturas de Dados Fundamentais. São Paulo: Editora Erica, 1996. •VELOSO, Paulo et al. Estruturas de Dados. Rio de Janeiro: Editora Campus, 1983.

×