Pilas (Stack) en Swift

Como sabras los languages de POO siempre cuentan con estructuras de datos que nos ayudan a almacenar objetos dentro de nuestros programas para luego poder operarlos según nuestras necesidades.

Existen varias estructuras de datos como Arreglos, Lista, HashTables, Colas y Pilas entre otras. En esta guía voy a mostrarte una forma de implementar una Pila o Stack.

Definición de Pila (Stack)

Empecemos por definir que es una pila, una pila es una estructura de datos que almacena los elementos bajo el principio LI-FO que significa "First In - First Out" o en español "el primero en entrar es el primero en salir".

Puedes imaginarte una pila de libros o la famosa torre de Hanoi que son ejemplos que te ayudarán a visualizar este concepto.

Estructura y Funciones

stack definition

Las pilas tienen un par de funciones básicas, push y pop.

PUSH
Esta función se encarga de agregar un elemento a la pila, siembre teniendo en mente el principio de LI-FO, es decir que el elemento se insertaría en la parte superior de la pila.

POP
Esta función por el contrario saca el elemento que se encuentra mas arriba de la pila y lo retorna, en otras palabras seria el ultimo elemento que se agrego.

Implementación

Para iniciar vamos a definir una clase que será la encargada de modelar los elementos de nuestra pila junto con una referencia a su predecesor.

class Node<T> {  
    var element: T?
    var next: Node<T>?

    init(element: T?) {
        self.element = element
    }
}

La clase anterior tiene dos propiedades element y next.

element
Se encargará de almacenar el valor que guardaremos en nuestra pila como un String, Int, Double etc.

next
Es la referencia al elemento siguiente según el orden de la pila, en este caso seria el elemento que estaría debajo de él.

Ahora crearemos otra clase que sera como tal nuestra pila la cual implementará las dos funciones básicas que anteriormente mencionamos push y pop.

class Stack<T> {  
    var head: Node<T>?
    var size = 0

    func push(element: T?) {
        let lastNode = head
        let node = Node(element: element)
        head = node
        head?.next = lastNode
        size += 1
    }

    func pop() -> T? {
        if let obj = head?.element {
            head = head?.next
            return obj
            size -= 1
        }
        return nil
    }
}

Se que puede parecer un poco extraña la clase anterior pero tratare de explicarla lo mejor posible y para esto nada mejor que una imagen.

stack logic

Basicamente los que se hace es crear referencias de un elemento a otro, cada vez que se agrega un nuevo elemento push este elemento se asigna como tope o head de la pila y el siguiente o next sera nuestro anterior head, sencillo verdad 🤓.

Ademas de esto definimos una variable size que nos permitirá obtener el tamaño de la pila simplemente hacemos +1 en cada push y -1 en cada pop.

Cada vez que agregamos nuevos elementos siempre se crearan nuevas referencias en memoria, por lo anterior nuestra pila o Stack se transformaría en un tipo de colección, que es como funcionan la mayorías de las estructuras de datos.

Bonus

Peek una función útil para nuestra clase Stack.

peek
Esta función es similar a pop pero con una pequeña diferencia, no saca de la pila el ultimo elemento, solamente lo devuelve.

func peek() -> T? {  
    if let obj = head?.element {
        return obj
    }
    return nil
}

Usando nuestra pila

Ya terminada la implementación, el uso de la pila es muy sencillo

let stack = Stack<Int>()  
stack.push(element: 1)  
stack.push(element: 2)  
stack.push(element: 3)

// Visualización de la pila
// [3]
// [2]
// [1]

stack.size    // return 3

stack.pop()  // return 3  
stack.peek() // return 2  
stack.pop()  // return 2  
stack.pop()  // return 1  

Espero te haya servidor de ayuda esta guía, próximamente colas y listas. Recuerda que puedes ver el código fuente en GitHub

Jose Aponte

Desarrollador full-stack apasionado por las tecnologías de información y los lenguajes de programación. Me gustan divertirme con mi familia, mi lema es "Nunca paras de Aprender"

Bogota

Subscribe to Jappsku Engineering Blog

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!