Aula por Victor Camilo
Queue vs Vector
Todos vocês com certeza já entraram em uma fila, e você provavelmente se lembra de como funciona, a pessoa mais a frente da fila é a primeira a ser atendida e sair, e as pessoas que chegam sempre vão para o final da fila (não furem filas).
Assim sendo, imagine uma queue como uma estrutura para facilitar e permitir que criemos filas e as manipulemos como tais dentro do código. Para exemplificar, suponha que você tenha alguns elementos em um vector e queira eliminar o primeiro. Teríamos o seguinte código:
#include <iostream> | |
#include <vector> | |
using namespace std; | |
int main() | |
{ | |
vector<int> V; | |
V.push_back(1); | |
V.push_back(2); | |
V.push_back(3); | |
V.push_back(4); | |
V.push_back(5); | |
// Removendo o primeiro elemento | |
for(int i = 0 ; i < (int)V.size() - 1 ; i++) | |
{ | |
V[i] = V[i+1]; | |
} | |
V.pop_back(); | |
return 0; | |
} |
Note que para remover o primeiro elemento, passamos por todos os outros elementos do vector, sendo assim, temos uma complexidade de $O(n)$ para a operação, enquanto usando uma Queue teríamos uma complexidade linear e um código mais simples. No tópico a seguir veremos como utilizar e manipular queues.
Declarando e utilizando uma queue
A declaração desta estrutura é igual a de um vector, e possui aplicação simples e dedutivas, facilitando a resolução de problemas em que pode ser aplicada quando comparada a uma resolução utilizando outras estruturas, por exemplo. Uma queue tem duas operações principais: adicionar um elemento no final de uma fila e remover o elemento no início. Vamos ver como fazer cada um desses por meios dos exemplos a seguir.
#include <iostream> | |
#include <queue> | |
using namespace std; | |
int main() | |
{ | |
queue<int> fila; | |
int n; | |
// Adicionando n elementos | |
cin >> n; | |
for(int i = 0 ; i < n ; i++) | |
{ | |
int id; | |
cin >> id; | |
fila.push(id); | |
} | |
// Removendo os n elementos da frente da fila | |
for(int i = 0 ; i < n ; i++) fila.pop(); | |
/* | |
Agora imagine uma situação em que há k pessoas inicialmente em uma fila para sacarem | |
cada um uma quantia diferente de dinheiro e queremos saber quanto dinheiro foi sacado | |
no final enquanto administramos a fila. Cada pessoa tem um id, que vai aumentando de | |
1 em 1 a partir do primeiro de acordo com que as pessoas entram na fila. | |
*/ | |
int atv; // variável que vai definir que atividade realizar | |
int din; // quantidade de dinheiro sacado por cada pessoa | |
int dintotal;// quantidade de dinheiro sacada por todas as pessoas juntas | |
int k; | |
cin >> k; | |
for(int i = 1 ; i < k + 1 ; i++) fila.push(i); // adicionando as pessoas iniciais na fila | |
while(cin >> atv) | |
{ | |
if(atv == 1) // Se a atividade for 1, vamos adicionar alguém na fila ao final da fila | |
{ | |
int id; | |
cin >> id; | |
fila.push(id); | |
} | |
else if(atv == 2) // Se a atividade for 2, vamos atender atender a primeira pessoa da fila | |
{ | |
cin >> din; // quantidade de dinheiro que a pessoa sacou | |
dintotal += din; | |
fila.pop(); // excluimos a pessoa que acabamos de atender da fila | |
} | |
if(fila.empty()) // se a fila estiver vazia, encerramos o processo | |
break; | |
} | |
cout << dintotal; // após acabar o processo, imprimimos a todo o dinheiro sacado | |
return 0; | |
} |
Ao lermos o código podemos notar que ambos os processos de adicionar e remover elementos possuem complexidade linear, o que pode nos ser muito útil em problemas nos quais precisamos tratar de filas, e isso torna claro sua utilidade para aplicação na solução de problemas.
Finalização
Agora que já apresentamos o funcionamento de uma queue e o porquê de usá-la, confira nossas outras aulas e teste seus conhecimentos pelos nossos simulados. Para mais métodos utilizando queue, verifique a Referência C++.