La estructura de datos de JavaScript de pila

Una pila es una estructura de datos que tiene muchas más limitaciones en comparación con las matrices.

Podemos agregar elementos a una pila solo agregándolos en la parte superior. Y solo podemos eliminar el elemento de la parte superior de la pila.

Piense en ello como una pila de libros. Solo puede agregar libros en la parte superior y solo puede eliminar el libro en la parte superior.

Entonces, si agrega un montón de libros y luego desea acceder al primer libro que agregó, primero debe eliminar todos los libros, hasta llegar al que agregó.

Este concepto se llama primero en entrar, último en salir (FILO)

Si bien las matrices en JavaScript están integradas y no es necesario crearlas, debemos implementar pilas.

Vamos a crear una estructura de datos que encapsule nuestros datos, haciéndolos inaccesibles desde el exterior, y solo permitiremos elpush()método para agregar datos a la pila, y elpop()método para eliminar datos de la pila.

Podemos hacer esto de muchas formas diferentes. Una forma es usar clases y, en particular, voy a usarcampos de clases privadas. Los campos de clases privadas no forman parte del estándar de JavaScripttodavía, pero están disponibles en Chrome, Edge, Safari y Node.js desde la versión 12. Aún no están disponibles en Firefox, con suerte pronto.

¿Por qué los uso? Porque nos permiten encapsular muy fácilmente el estado interno de la clase y protegerlo del exterior.

class Stack {
  #items = []
  push = (element) => this.#items.push(element)
  pop = () => this.#items.pop()
  isempty = () => this.#items.length === 0
  empty = () => (this.#items.length = 0)
  size = () => this.#items.length
}

Tenemos 5 métodos públicos:pushypoppara agregar / quitar de la pila,isemptypara comprobar si la pila está vacía,emptypara vaciar la pila,sizepara obtener el tamaño de la pila.

Ahora podemos crear un objeto de pila a partir de la clase y trabajar con él:

const stack = new Stack()
stack.push(1)
stack.push(2)
stack.push(3)
console.log(stack.size()) //3
console.log(stack.pop()) //[ 3 ]
console.log(stack.size()) //2

Todo funcionaría de la misma manera con una propiedad pública:

class Stack {
  items = []
  push = (element) => this.items.push(element)
  pop = () => this.items.pop()
  isempty = () => this.items.length === 0
  empty = () => (this.items.length = 0)
  size = () => this.items.length
}

excepto que ahora podemos inspeccionaritemsdesde fuera:

const stack = new Stack()
stack.push(2)
console.log(stack.items) //[ 2 ]

mientras que con propiedades de clase privada, accediendostack.itemsvolveríaundefined.


Más tutoriales de js: