Estruturas de Dados: Entendendo e implementando Filas (Queues) com Typescript
Tags: typescript, datastructure, fila, queue
Published: 2022-12-16 23:40:39

## Antes pilha, hoje fila

Anteriormente a gente tinha falado sobre pilhas (stacks) certo? Caso você não tenha lido é bom dar uma passada no artigo anterior pra entender algumas coisinhas que vamos abordar hoje, mas sem demorar muito, vamos lá.

Então, se lembram da stack? Eu tinha falado que ela era considerada na computação como do tipo **FILO (First In, Last Out)**, no caso seria “Primeiro a entrar, último a sair”. Então, quando a gente pensa em filas (queues) é praticamente tudo idêntico as pilhas, a única diferença é que a fila é classificada como do tipo **FIFO (!== FILO)**, perceba que o finalzinho muda:

- FI **LO** - Primeiro a entrar, **último** a sair.
- FI **FO** - Primeiro a entrar, **primeiro** a sair.

Isso significa que agora ao invés de pensar como se fosse uma pilha de livros a gente pode pensar como se fosse uma fila normal mesmo, de banco por exemplo; Imagina que você acordou 8h da manhã, precisa ir no banco pra resolver problema e tudo mais que não está funcionando resolver pelo app. Você chega lá e a fila ainda tá vazia! Primeiro da fila, pouco tempo depois chegam mais 10 pessoas atrás de você, qual seria a primeira pessoa a ser atendida? 

Você que chegou primeiro, certo? Então pronto, a estrutura de dados fila é justamente isso, ao invés de remover o item do final da lista (como na pilha), nós vamos remover do começo.

## Entendendo a fila

Então vamos falar da parte de código logo que é a coisa mais simples do mundo. Só duas coisinhas antes, provavelmente se vocês forem procurar conteúdos sobre filas e tudo mais, vão encontrar dois termos **enqueue** e **dequeue**, ambos são como geralmente são chamados o ato de adicionar na fila e remover, enqueue (enfileirar) e dequeue (desfileirar), ta bem? Aqui pra facilitar a gente vai usar os métodos do Typescript mesmo, que por sinal já nos dá de maneira nativa a opção de remover um item do começo de uma lista, é a função `shift`.

### `shift()`

O método `shift()` **remove o primeiro elemento da lista** e **retorna o elemento removido**. Então a gente pode fazer assim:

```ts
// Vamos criar o array que vai ser nossa fila de pessoas no banco
const queue: string[] = [];

// Já sabemos do método `push` que vimos no artigo sobre pilhas, ele
// serve para adicionar um item no final do array, então digamos que
// a Carol acabou de chegar no banco e entrou na fila, então:

queue.push("Carol");

// Acabamos de adicionar a carol na fila [Carol], mas lógico que não
// vai ter só ela na fila, chegaram mais duas pessoas.

queue.push("Jaldo Script");
queue.push("Cecília Sharp");

// Então agora a nossa fila está com 3 pessoas [Carol, Jaldo, Cecília]
// O caixa chamou o próximo da fila, que é a carol que chegou primeiro
// então no código essa é a hora de retirar o primeiro da fila com o 
// método `shift`

let pessoaAtendida = queue.shift();

// Agora beleza, a carol que estava como primeira da fila acabou de ser
// atendida e não precisa mais estar na fila.

console.log(pessoaAtendida); // Carol
console.log(queue); // ["Jaldo Script", "Cecília Sharp"]

// E agora a nossa fila ficou assim [Jaldo, Cecília], logo após o caixa
// chamou o próximo que no caso foi o Sr. Jaldo Script

pessoaAtendida = queue.shift();
console.log(pessoaAtendida); // Jaldo Script

// E por fim, chamou a Sra. Cecília Sharp

pessoaAtendida = queue.shift();
console.log(pessoaAtendida);

// Pronto, atendemos todo mundo e na ordem certa, sem causar estresse!
```

E se lembrem... Sempre [leiam a documentação!](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/shift)

E é isso, aprendemos mais um método simples e mais uma estrutura de dados! Vamos só repassar umas coisinhas:

- Sempre adicionamos no final da fila, para isso usamos o método `.push()`
- Sempre removemos do começo da fila e para isso usamos o `.shift()`
- Filas ou Queues são classificadas como **FIFO (First In First Out)**, ou seja, o primeiro a entrar é o primeiro a sair da fila.

Isso é quase tudo! Leiam as documentações e nos vemos na próxima estrutura.