Stack

En informática, una pila o stack es un famoso tipo de datos abstracto que proporciona ciertas operaciones sobre una colección de elementos. Las pilas tienen una larga historia, que se remonta a los primeros programas informáticos y se documentó por primera vez en 1946.

Aunque puede que nunca necesites construir una pila, probablemente interactúes con una en tu programación diaria en forma de 'pila de llamadas' o call stack, por lo que parece un concepto importante que aprender. 

Construir pilas también nos da la oportunidad de practicar nuestros primeros pasos en el desarrollo basado en pruebas, TDD.

Instrucciones

Para esta kata, construye una pila que soporte las siguientes operaciones:

  • Push - Añadir un elemento a la parte superior de la pila    
  • Pop - Quitar un elemento de la parte superior de la pila, devolviéndolo
  • Comprobación de vacío - Comprueba si la pila está vacía o no
  • Tamaño - Cuenta los elementos de la pila
  • Peek (mirar) - Comprueba la parte superior de la pila sin hacer popping

stack-example

Al crear estas operaciones, piensa primero en la forma más sencilla de hacerlo. No te decantes por lo que crees que podría ser la implementación definitiva de inmediato.

Estos son algunos detalles importantes que debes tener en cuenta al construir tu pila. Incluso podrías pensar en ellos como requisitos iterativos junto con tus operaciones:

  • Gestionar los desbordamientos cuando se introducen demasiados elementos en la pila.
  • Gestionar la falta de flujo cuando se sacan demasiados elementos de la pila
  • Gestionar la falta de flujo cuando no hay elementos para mirar en la pila
  • Gestionar los intentos de crear una pila con una capacidad no válida (números negativos)

Es posible que reconozcas uno de estos requisitos como el origen de la famosa frase "Stack Overflow" (desbordamiento de pila), que también es el nombre de un sitio web que probablemente consultes a diario.

Requisito extra

Cuando hayas terminado de construir tu pila y si quieres profundizar un poco más, prueba lo siguiente.

Tu pila actualmente tiene protección para una capacidad de 0. Esto también se conoce como 'pila nula' y una pila con más de 0 se conoce como 'pila delimitada'. ¿Realmente necesitas todo ese otro código si recibes la petición de crear una pila nula?

En programación hay formas de proporcionar un comportamiento fijo para situaciones conocidas. Por ejemplo, sabes que una pila nula estará siempre vacía, siempre se desbordará cuando se intente un push y siempre se reducirá cuando se intente un pop.

Instrucciones

Si el lenguaje que utilizas admite polimorfismo, inventa una forma de actualizar la creación de una pila, de modo que cree una pila nula o acotada en función de la capacidad solicitada. Entonces podrás añadir sólo el código que necesites para cada situación. Tus pruebas deberían seguir siendo las mismas, pero el comportamiento subyacente habrá cambiado.

Ayuda

Hay más lenguajes compatibles con el polimorfismo de lo que crees. Los lenguajes tipados estáticamente como C# y Java proporcionan polimorfismo seguro automático, evitando que te líes con la memoria y haciendo uso del subtipado. En un lenguaje como C, que te permite controlar las referencias de memoria, puedes hacer polimorfismo usando punteros de funciones. Incluso se puede hacer polimorfismo en un lenguaje de tipado dinámico como JavaScript y Python, ¡simplemente los tipos están ocultos!

Si sigues atascado y estás confundido con todo esto del polimorfismo, puedes encontrar un ejemplo de cómo resolver este requisito en Java aquí, pero sólo míralo si lo has intentado tú mismo.