Mudanças entre as edições de "PRG29003: Introdução a Filas"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 30: Linha 30:
  
  
Nesta primeira etapa da disciplina, o estudo de filas se dará com o uso de uma fila já implementada. A [http://tele.sj.ifsc.edu.br/~msobral/prg2/Prg2_Clion.tar.xz biblioteca Prglib para CLion] oferece implementações para as estruturas de dados que são o assunto da disciplina.  A declaração da Fila nessa biblioteca é esta (note que ela é declarada como um [[Introdução_C++#Templates|template]]):
+
Nesta primeira etapa da disciplina, o estudo de filas se dará com o uso de uma fila já implementada. A [https://pt.wikipedia.org/wiki/Standard_Template_Library biblioteca STL (Standard Template Library)] oferece implementações para as estruturas de dados que são o assunto da disciplina.  A declaração da ''fila'' nessa biblioteca é esta (note que ela é declarada como um [[Introdução_C++#Templates|template]]):
 
+
* [http://www.cplusplus.com/reference/queue/queue/ A fila na biblioteca STL]
<syntaxhighlight lang=c>
 
template <typename T> class fila {
 
public:
 
    // construtor: cria fila com capacidade N
 
    fila(unsigned int N);
 
   
 
    // construtor: cria fila que é cópia da fila "orig"
 
    fila(const fila<T>& orig);
 
   
 
    // destrutor
 
    virtual ~fila();
 
   
 
    // operador de atribuição: torna esta fila uma cópia da "outra" fila
 
    fila<T>& operator=(const fila<T> & outra);
 
   
 
    // enfileira um dado
 
    void enfileira(const T & algo);
 
   
 
    // desenfileira um dado
 
    T desenfileira();
 
   
 
    // retorna uma referência ao dado que está no início da fila
 
    const T & frente() const;
 
   
 
    // testa se fila está vazia
 
    bool vazia() const;
 
 
 
    // testa se fila está cheia
 
    bool cheia() const;
 
   
 
    // retorna a quantidade de dados armazenados
 
    unsigned int comprimento() const;
 
   
 
    // retorna a capacidade da fila (quantos dados cabem)
 
    unsigned int capacidade() const;
 
   
 
    // expande a capacidade da fila para o novo valor "N"
 
    void expande(unsigned int N);
 
   
 
    // remove todos os dados da fila
 
    void esvazia();
 
};
 
</syntaxhighlight>''Arquivo libs/fila.h''
 
 
 
  
 
... e um exemplo de uso é mostrado a seguir:
 
... e um exemplo de uso é mostrado a seguir:
Linha 82: Linha 38:
 
#include <iostream>
 
#include <iostream>
 
#include <string>
 
#include <string>
#include "prglib.h"
+
#include <queue>
  
 
using namespace std;
 
using namespace std;
  
 
int main() {
 
int main() {
   // uma fila com capacidade de armazenar 20 inteiros
+
   // uma fila que armazena números inteiros
   prglib::fila<int> numeros(20);
+
   queue<int> numeros;
  
   // uma fila com capacidade de armazenar 20 string
+
   // uma fila que armazena string
   prglib::fila<string> coisas(20);
+
   queue<string> coisas;
  
   numeros.enfileira(6);
+
  // push_back adiciona um dado no fim da fila
   numeros.enfileira(8);
+
   numeros.push_back(6);
   numeros.enfileira(10);
+
   numeros.push_back(8);
   numeros.enfileira(12);
+
   numeros.push_back(10);
 +
   numeros.push_back(12);
  
   coisas.enfileira("banana");
+
   coisas.push_back("banana");
   coisas.enfileira("graviola");
+
   coisas.push_back("graviola");
   coisas.enfileira("sapoti");
+
   coisas.push_back("sapoti");
   coisas.enfileira("siriguela");
+
   coisas.push_back("siriguela");
   coisas.enfileira("caju");
+
   coisas.push_back("caju");
  
   cout << "Fila de numeros tem comprimento=" << numeros.comprimento() << endl;
+
   cout << "Fila de numeros tem comprimento=" << numeros.size() << endl;
   cout << "Fila de string tem comprimento=" << coisas.comprimento() << endl;
+
   cout << "Fila de string tem comprimento=" << coisas.size() << endl;
  
   while (not numeros.vazia()) {
+
   while (! numeros.empty()) {
     cout << "Numero: " << numeros.desenfileira() << endl;
+
     cout << "Numero: " << numeros.front() << endl;
 +
    numeros.pop(); // desenfileira um número
 
   }
 
   }
  
   while (not coisas.vazia()) {
+
   while (! coisas.empty()) {
     cout << "String: " << coisas.desenfileira() << endl;
+
     cout << "String: " << coisas.front() << endl;
 +
    coisas.pop(); // desenfileira uma string
 
   }
 
   }
 
}
 
}

Edição das 16h41min de 17 de fevereiro de 2020

Próxima aula


Uma fila é uma estrutura de dados linear. Os dados nela armazenados são dispostos por ordem de entrada, formando uma sequência. A retirada de dados também respeita a ordem de chegada, assim os dados saem de uma fila na mesma ordem em que entraram. Esse comportamento é denominado FIFO (First In First Out).


PRG2-Queueof.gif
Uma fila real ... (fonte da imagem)

Existem várias aplicações para filas em programas. Tipicamente, quando algum dado precisa esperar para ser processado, ele pode ser armazenado em uma fila. Alguns exemplos:

  • Eventos em um ambiente gráfico de um sistema operacional, tais como clique de mouse, tecla pressionada, e apresentação de elementos gráficos, são processados na ordem em que ocorrem. Esses eventos são armazenados em uma fila de espera.
  • Sistemas operacionais costumam manter uma fila de processos que estão aptos a executar, ou que estão em espera pela ocorrência de um evento (lembrem disso lá na disciplina de Sistemas Operacionais).
  • Programas de computador, incluindo o sistema operacional, precisam usualmente oferecer uma área de espera para mensagens entre processos, subsistemas ou mesmo aplicações de rede. Essa área de espera, por vezes chamada de buffer, costuma ser implementada na forma de uma fila.
  • Existem algoritmos específicos que dependem de filas para funcionarem. Um exemplo é o algoritmo de busca em largura (breadth-first).


No caso mais geral, uma fila funciona como mostrado na figura a seguir:

Prg-queue.png


Uma fila é acessada com três operações principais (existem outras):

  • enfileiramento: usada para acrescentar um dado ao final da fila
  • desenfileiramento: usada para retirar um dado do início da fila
  • frente: usada para acessar o dado que está no início da fila, porém sem retirá-lo


Nesta primeira etapa da disciplina, o estudo de filas se dará com o uso de uma fila já implementada. A biblioteca STL (Standard Template Library) oferece implementações para as estruturas de dados que são o assunto da disciplina. A declaração da fila nessa biblioteca é esta (note que ela é declarada como um template):

... e um exemplo de uso é mostrado a seguir:

#include <iostream>
#include <string>
#include <queue>

using namespace std;

int main() {
  // uma fila que armazena números inteiros
  queue<int> numeros;

  // uma fila que armazena string
  queue<string> coisas;

  // push_back adiciona um dado no fim da fila
  numeros.push_back(6);
  numeros.push_back(8);
  numeros.push_back(10);
  numeros.push_back(12);

  coisas.push_back("banana");
  coisas.push_back("graviola");
  coisas.push_back("sapoti");
  coisas.push_back("siriguela");
  coisas.push_back("caju");

  cout << "Fila de numeros tem comprimento=" << numeros.size() << endl;
  cout << "Fila de string tem comprimento=" << coisas.size() << endl;

  while (! numeros.empty()) {
    cout << "Numero: " << numeros.front() << endl;
    numeros.pop(); // desenfileira um número
  }

  while (! coisas.empty()) {
    cout << "String: " << coisas.front() << endl;
    coisas.pop(); // desenfileira uma string
  }
}


Exercícios


  1. Resolva os seguintes exercícios sobre filas: