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
(Criou página com '* [http://wiki.nil.com/Queuing_Principles_in_Cisco_IOS Uma aplicação de filas em roteadores] De forma geral, uma fila é uma estrutura de dados que funciona como mostrado na ...')
 
Linha 2: Linha 2:
  
  
De forma geral, uma fila é uma estrutura de dados que funciona como mostrado na figura abaixo:
+
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 [https://en.wikipedia.org/wiki/FIFO_(computing_and_electronics) FIFO] (''First In First Out''). No caso mais geral, uma fila funciona como mostrado na figura a seguir:
  
 
[[imagem:Prg-queue.png]]
 
[[imagem:Prg-queue.png]]
  
  
A declaração da Fila na biblioteca Prglib é esta:
+
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
 +
 
 +
 
 +
A declaração da Fila na [http://tele.sj.ifsc.edu.br/~msobral/Prg2.zip biblioteca Prglib] é esta:
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
template <typename T> class fila : public std::queue<T> {
+
template <typename T> class fila {
 
public:
 
public:
 +
    // construtor: cria fila com capacidade N
 
     fila(unsigned int N);
 
     fila(unsigned int N);
 +
   
 +
    // construtor: cria fila que é cópia da fila "orig"
 
     fila(const fila<T>& orig);
 
     fila(const fila<T>& orig);
 +
   
 +
    // destrutor
 
     virtual ~fila();
 
     virtual ~fila();
 +
   
 +
    // operador de atribuição: torna esta fila uma cópia da "outra" fila
 
     fila<T>& operator=(const fila<T> & outra);
 
     fila<T>& operator=(const fila<T> & outra);
 +
   
 +
    // enfileira um dado
 
     void enfileira(const T & algo);
 
     void enfileira(const T & algo);
 +
   
 +
    // desenfileira um dado
 
     T desenfileira();
 
     T desenfileira();
 +
   
 +
    // retorna uma referência ao dado que está no início da fila
 
     const T & frente() const;
 
     const T & frente() const;
 +
   
 +
    // testa se fila está vazia
 
     bool vazia() const;
 
     bool vazia() const;
 +
 +
    // testa se fila está cheia
 
     bool cheia() const;
 
     bool cheia() const;
 +
   
 +
    // retorna a quantidade de dados armazenados
 
     unsigned int comprimento() const;
 
     unsigned int comprimento() const;
 +
   
 +
    // retorna a capacidade da fila (quantos dados cabem)
 
     unsigned int capacidade() const;
 
     unsigned int capacidade() const;
private:
+
   
     unsigned int N;
+
     // 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''
 
</syntaxhighlight>''Arquivo libs/fila.h''

Edição das 08h59min de 27 de fevereiro de 2018


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


A declaração da Fila na biblioteca Prglib é esta:

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

Arquivo libs/fila.h


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

#include <iostream>
#include <string>
#include "prglib.h"

using namespace std;

int main() {
  // uma fila com capacidade de armazenar 20 inteiros
  prglib::fila<int> numeros(20);

  // uma fila com capacidade de armazenar 20 string
  prglib::fila<string> coisas(20);

  numeros.enfileira(6);
  numeros.enfileira(8);
  numeros.enfileira(10);
  numeros.enfileira(12);

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

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

  while (not numeros.vazia()) {
    cout << "Numero: " << numeros.desenfileira() << endl;
  }

  while (not coisas.vazia()) {
    cout << "String: " << coisas.desenfileira() << endl;
  }
}

Exercícios

  1. Resolva os seguintes exercícios sobre filas: