Qual é a melhor maneira de implementar uma pilha e uma fila em JavaScript?
Eu estou olhando para fazer o algoritmo shunting-yard e vou precisar dessas estruturas de dados.
javascript
data-structures
stack
queue
KingNestor
fonte
fonte
O Javascript possui métodos push e pop, que operam em objetos comuns da matriz Javascript.
Para filas, veja aqui:
http://safalra.com/web-design/javascript/queues/
fonte
Matrizes.
Pilha:
Fila:
fonte
push
epop
, o problema será resolvido. Eu realmente não vejo o seu ponto aqui.Se você quiser criar suas próprias estruturas de dados, poderá criar suas próprias:
E para fila:
fonte
Node
criadores sendo excluídos quando popping / desenfileiramento ... eles não ficam apenas ocupando memória demais até o navegador travar?delete
palavra - chave, mas isso só é útil para marcar uma propriedade de um objeto como não presente - o que é diferente de apenas atribuirundefined
à propriedade . O JavaScript também possui umnew
operador, mas isso é usado apenas para definirthis
um novo objeto vazio ao chamar uma função. Em C ++, você precisa emparelhar todosnew
com adelete
, mas não em JavaScript, porque o GC. Para parar de usar memória em JavaScript, pare de fazer referência ao objeto e ele será recuperado.Minha implementação Stacke QueueusoLinked List
fonte
O deslocamento da matriz Javascript () é lento, especialmente quando há muitos elementos. Conheço duas maneiras de implementar a fila com complexidade O (1) amortizada.
O primeiro é usar buffer circular e duplicação de tabelas. Eu já implementei isso antes. Você pode ver meu código fonte aqui https://github.com/kevyuu/rapid-queue
A segunda maneira é usar duas pilhas. Este é o código para a fila com duas pilhas
Esta é uma comparação de desempenho usando jsPerf
CircularQueue.shift () vs Array.shift ()
http://jsperf.com/rapidqueue-shift-vs-array-shift
Como você pode ver, é significativamente mais rápido com grandes conjuntos de dados
fonte
Existem várias maneiras pelas quais você pode implementar pilhas e filas em Javascript. A maioria das respostas acima são implementações bastante superficiais e eu tentaria implementar algo mais legível (usando os novos recursos de sintaxe do es6) e robusto.
Aqui está a implementação da pilha:
E é assim que você pode usar a pilha:
Se você deseja ver a descrição detalhada sobre esta implementação e como ela pode ser melhorada, leia aqui: http://jschap.com/data-structures-in-javascript-stack/
Aqui está o código para implementação da fila no es6:
Veja como você pode usar esta implementação:
Para seguir o tutorial completo de como essas estruturas de dados foram implementadas e como elas podem ser melhoradas, consulte a série 'Jogando com estruturas de dados em javascript' em jschap.com. Aqui estão os links para filas - http://jschap.com/playing-data-structures-javascript-queues/
fonte
Você pode usar sua própria classe de customização com base no conceito, aqui o trecho de código que você pode usar para fazer as coisas
e para verificar isso, use seu console e tente estas linhas, uma por uma.
fonte
fonte
Ou então, você pode usar duas matrizes para implementar a estrutura de dados da fila.
Se eu exibir os elementos agora, a saída será 3,2,1. Mas queremos uma estrutura FIFO para que você possa fazer o seguinte.
fonte
push
depois da primeira vez que vocêpop
Aqui está uma implementação de fila bastante simples com dois objetivos:
A implementação da pilha compartilha apenas o segundo objetivo.
fonte
A implementação da pilha é trivial, conforme explicado nas outras respostas.
No entanto, não encontrei respostas satisfatórias neste tópico para implementar uma fila em javascript, então criei as minhas.
Existem três tipos de soluções neste segmento:
array.shift()
uma matriz grande, é muito ineficiente.Matrizes de turnos atrasados são a solução mais satisfatória em minha mente, mas ainda armazenam tudo em um grande array contíguo que pode ser problemático, e o aplicativo cambaleia quando o array é fatiado.
Fiz uma implementação usando listas vinculadas de pequenas matrizes (no máximo 1000 elementos cada). As matrizes se comportam como matrizes de turno atrasado, exceto que nunca são fatiadas: quando todos os elementos da matriz são removidos, a matriz é simplesmente descartada.
O pacote está no npm com funcionalidade FIFO básica, acabei de enviar recentemente. O código é dividido em duas partes.
Aqui está a primeira parte
E aqui está a
Queue
classe principal :As anotações de tipo (
: X
) podem ser facilmente removidas para obter o código javascript ES6.fonte
Se você entende pilhas com as funções push () e pop (), a fila é apenas para realizar uma dessas operações no sentido oposto. Oposto de push () é não shift () e o oposto de pop () es shift (). Então:
fonte
.shift()
método não é uma implementação de fila adequada. É O (n) em vez de O (1) e será lento para grandes filas.Aqui está a versão da lista vinculada de uma fila que também inclui o último nó, conforme sugerido por @perkins e conforme mais apropriado.
fonte
Se você estiver procurando pela implementação do ES6 OOP da estrutura de dados Stack and Queue com algumas operações básicas (com base em listas vinculadas), pode ser o seguinte:
Queue.js
Stack.js
A implementação do LinkedList usada para Stack e Queue nos exemplos acima pode ser encontrada no GitHub aqui .
fonte
Nenhuma matriz
fonte
A estrutura Array regular em Javascript é uma pilha (primeiro a entrar, último a sair) e também pode ser usada como uma fila (primeiro a entrar, primeiro a sair), dependendo das chamadas feitas.
Verifique este link para ver como fazer uma matriz agir como uma fila:
Filas
fonte
Saudações,
Em Javascript, a implementação de pilhas e filas é a seguinte:
Pilha: Uma pilha é um contêiner de objetos que são inseridos e removidos de acordo com o princípio LIFO (last-in-first-out).
Fila: Uma fila é um contêiner de objetos (uma coleção linear) que são inseridos e removidos de acordo com o princípio FIFO (primeiro a entrar, primeiro a sair).
Unshift: o método adiciona um ou mais elementos ao início de uma matriz.
Shift: o método remove o primeiro elemento de uma matriz.
fonte
fonte
Parece-me que a matriz incorporada é adequada para uma pilha. Se você deseja uma fila no TypeScript, aqui está uma implementação
E aqui está um
Jest
teste para issoEspero que alguém ache isso útil,
Felicidades,
Stu
fonte
Crie um par de classes que forneça os vários métodos que cada uma dessas estruturas de dados possui (push, pop, peek, etc). Agora implemente os métodos. Se você estiver familiarizado com os conceitos por trás da pilha / fila, isso deve ser bem direto. Você pode implementar a pilha com uma matriz e uma fila com uma lista vinculada, embora certamente existam outras maneiras de fazer isso. O Javascript facilitará isso, porque é de tipo fraco, para que você nem precise se preocupar com tipos genéricos, o que seria necessário se estivesse implementando em Java ou C #.
fonte
Aqui está minha implementação de pilhas.
fonte
você pode usar o WeakMaps para implementar a propriedade privada na classe ES6 e os benefícios das propriedades e métodos de String na linguagem JavaScript, como abaixo:
fonte
Construa uma fila usando duas pilhas.
fonte