🥇 Pilas (Stacks)

🍿 ¿Qué son las pilas (stacks)?

Una pila (stack) es un lugar en la cual se almacenan y retraen valores. La forma en la que los valores entran y salen es mediante el concepto Last In First Out (El último en llegar es el primero en salir). Los datos son agregados a la pila utilizando la operación push y los datos son extraídos de la pila mediante la operación pop.

🍿 ¿Cómo se agregan valores a una pila?

Para agregar valores a una pila utilizamos la instrucción push y especificamos el valor a apilar.

push("Hugo")

[Hugo]
push("Paco")

["Paco"]
["Hugo"]
push("Luis")

["Luis"]
["Paco"]
["Hugo"]

🍿 ¿Cómo extraer valores de una pila?

Para extraer valores de una pila utilizamos la instrucción pop, este retorna el valor de la parte superior al tiempo que lo remueve de la pila.

pop() => "Luis"

["Paco"]
["Hugo"]

🍿 ¿Cómo se relacionan los métodos y la pila del sistema?

Cuando un método es invocado, la ejecución en proceso es detenida y el control pasa al método invocado. Cuando este último se completa se retorna al punto donde la ejecución del primer método fue detenida.

Para mantener una referencia al lugar en donde se pausa la primera ejecución y regresar posteriormente ahí, el segundo método invocado y los posteriores se van almacenando en una pila. Conforme esta pila se va desahogando se van completando cada uno de los procesos.

package main

import "fmt"

func metodo1() {
	fmt.Println("inicia metodo 1")
	metodo2()
	fmt.Println("termina metodo 1")
}

func metodo2() {
	fmt.Println("inicia metodo 2")
	metodo3()
	fmt.Println("termina metodo 2")
}

func metodo3() {
	fmt.Println("inicia metodo 3")
	fmt.Println("termina metodo 3")
}

func main() {
	metodo1()
}

Salida.

inicia metodo 1
inicia metodo 2
inicia metodo 3
termina metodo 3
termina metodo 2
termina metodo 1

🍿 ¿Cómo operan los métodos dentro de una pila del sistema?

  • Cuando el programa inicia se ejecuta antes que nada el método main() que es el punto de entrada a los programas en Go.
  • El primer método en invocarse es metodo1()
  • El metodo1() llama a al metodo2() y le cede el control.
  • El metodo2() llama al metodo3() y le cede el control.
  • Cuando el metodo3() termina regresa el control al metodo2()
  • Cuando el metodo2() termina le cede el control a metodo1()
  • Cuando el metodo1() termina le cede el control al main()
  • El programa se completa

Es importante tener en cuenta que los métodos son implementados dentro de una pila. Cuando un método es llamado la dirección de la siguiente instrucción es puesta dentro de una pila. Cuando este método finaliza la dirección de ejecución es extraida de la pila.