Fila e Pilha com JavaScript

Provavelmente se você fez curso técnico de informática ou faculdade de tecnologia da informação, analise de sistemas, ciências da computação ou alguma área correlatada já teve uma matéria chamada estrutura de dados, que dentre outras coisas engloba o ensino de fila e pilha.

Fila ou FIFO (First-In, First-Out) significa o primeiro que entra é o primeiro que sai.

Pilha ou FILO (First-In, Last-Out) significa o primeiro que entra é o último que sai.

Fila

Para criarmos nossa fila vamos primeiro utilizar o básico do javascript.

var fila = [];
fila.push(1);
fila.push(2);
fila.push(3);
console.log(fila);

fila.shift();

fila.push(4);
console.log(fila);

fila.shift();
fila.shift();
console.log(fila);

O código acima é muito simples e básico, não requer nenhuma implementação mais elaborada, pois a própria linguagem javascript tem os métodos de array push() que acrescenta um elemento no final de uma array, aumentando assim o seu tamanho e o método shift() que retira o primeiro elemento de um array.

O resultado no console será [1, 2, 3], depois [2, 3, 4] e por fim [4].

Pilha

Vamos agora criar uma pilha.

var pilha = [];
pilha.push(1);
pilha.push(2);
pilha.push(3);

console.log(pilha);

pilha.pop();
pilha.push(4);

console.log(pilha);

pilha.pop();
pilha.push(5);
pilha.pop();

console.log(pilha);

Quase não alteramos nada no código acima do anterior, apenas modificamos a função que era a shift() para a pop(), que retira o último elemento de um array, modificando assim seu tamanho.

O resultado no console será [1, 2, 3] depois [1, 2, 4] e por fim [1, 2].

Implementando lógica própria.

E se o javascript não tivesse as funções shift(), pop() e push()? Teríamos que fazer na mão, certo? Então vamos lá.

Primeiro vamos desenvolver para a fila:

function Queue() {
    this.queue = [];
    this.insertQueue = param => this.queue[this.queue.length] = param;
    this.removeQueue = () => {
        if (this.queue.length > 0) {
            let obj = this.queue[0];
            this.queue.splice(0, 1);
            return obj;
        } else {
            return "Sem elementos na fila";
        }
    }
}

let q = new Queue();

q.insertQueue(1);
q.insertQueue(2);
q.insertQueue(3);

console.log(q.queue);

q.insertQueue(4);
q.insertQueue(5);
q.insertQueue(6);

q.removeQueue();
q.removeQueue();

console.log(q.queue);
console.log(q.removeQueue());

O que fizemos no código acima foi criar nossa própria função push() que foi a função insertQueue, ela recebeu um parâmetro e adicionou na posição da array que fosse equivalente ao tamanho da mesma, ou seja, como nossa array é vazia o tamanho dela é zero (0),  sendo assim quando inserimos um primeiro elemento ele ficará na posição queue[0], agora o valor da array será modificado para um (1) quando inserirmos o próximo elemento ele ficará na posição um (1), e assim por diante enquanto formos inserindo os elementos.

E a função removeQueue faz o contrário, ela pega o primeiro elemento queue[0] e remove ele com o método slice() que retorna uma cópia de parte de um array em um novo objeto array.

O resultado no console será [1, 2, 3] depois [3, 4, 5, 6] e por fim 3 que será o número que estamos retirando do nossa fila.

Retire mais elementos, insira mais elementos e mostre-os na tela para ver o resultado.

Vamos agora desenvolver para a pilha:

function Stack() {
    this.stack = [];
    this.insertStack = param => this.stack[this.stack.length] = param;
    this.removeStack = () => {
        if (this.stack.length > 0) {
            let obj = this.stack[this.stack.length - 1];
            this.stack.splice(this.stack.length - 1, 1);
            return obj;
        } else {
            return "Sem elementos na pilha";
        }
    }
}

let s = new Stack();

s.insertStack(1);
s.insertStack(2);
s.insertStack(3);

console.log(s.stack);

s.insertStack(4);
s.insertStack(5);

s.insertStack(6);

s.removeStack();
s.removeStack();

console.log(s.stack);
console.log(s.removeStack());

Basicamente o que tem de diferente no código é a função de remover, removeStack, ela acha o tamanho da array e retira um (1), para que assim consiga pegar o último elemento e retirar utilizando o slice().

O resultado no console será [1, 2, 3] depois [1, 2, 3, 4] e por fim 4 que será o número que estamos retirando do nossa fila.

Faça download do código aqui!

1 comentário

Deixe um comentário