Las pilas son estructuras de datos muy prácticas y que nos sirven para infinidad de aplicaciones. Dentro del desarrollo web no me ha tocado verles tanta utilidad como en aplicaciones de escritorio sin embargo las hay y en este microtutorial veremos como implementarlas en PHP.

Lo primero que hay que saber es que una pila -tanto en PHP como en Java y cualquier lenguaje- no es más que un arreglo de elementos que funciona mediante la filosofía LIFO. Ahora crearemos una clase para manejar una pila o stack.

<?php

class Stack {

	/**
	 * @var ArrayObject $stack El objeto que contiene la Pila
	 */
	private ArrayObject $stack;
	
	/**
	 * @var int $key El índice para organizar los elementos de la pila
	 */
	private int $key = 0;
  
	/**
	 * Constructor. Crea la pila
	 */
	public function __construct() {
		$this->stack = new ArrayObject();
	}
	
	/**
	 * Inserta un elemento en el tope de la pila.
	 *
	 * @param mixed $value Elemento a insertar
	 */
	public function push(mixed $value) : void {
		$this->stack->offsetSet($this->key, $value);
		$this->key = $this->key + 1;
	}
	
	/**
	 * Remueve el elemento al tope de la pila y lo regresa
	 *
	 * @return mixed El elemento del tope.
	 * Si la pila está vacía devolverá NULL
	 */
	public function pop() : mixed {
		$value = $this->peek();
		if($value !== null) {
			$this->stack->offsetUnset($this->key - 1);
			$this->key = $this->key - 1;
		}
		return $value;
	}
	
	/**
	 * Checa si la pila está vacía
	 *
	 * @return boolean True si está vacía, false caso contrario
	 */
	public function isEmpty() : bool {
		return $this->stack->count() == 0;
	}
	
	/**
	 * Cuenta el tamaño de la pila
	 *
	 * @return int El tamaño de la pila
	 */
	public function count() : int {
		return $this->stack->count();
	}
	
	/**
	 * Regresa el ultimo elemento de la pila, sin removerlo
	 * 
	 * @return mixed El último elemento de la pila
	 */
	public function peek() : mixed {
		if($this->stack->offsetExists($this->key - 1)) {
			$value = $this->stack->offsetGet($this->key - 1);
		}
		return $value ?? null;
	}
}
Lenguaje del código: PHP (php)

Esta clase es una implementación muy similar a la Stack de Java, y por lo tanto su uso es prácticamente igual.

Primero debemos crear una instancia de la clase u objeto y posteriormente trabajaremos con él insertando y sacando elementos.

<?php
// Creamos la pila
$stack = new Stack();

// Insertamos 5 elementos...
$stack->push('Hola');
$stack->push('Mundo');
$stack->push('Amigos');
$stack->push('de');
$stack->push('Microplagio');

// Mostramos el tamaño de la pila: (Muestra un 5):
echo $stack->count();

// Sacamos los últimos 4 elementos
$stack->pop();
$stack->pop();
$stack->pop();
$stack->pop();

// Si la pila no esta vacía mostramos el elemento del tope
if(!$stack->isEmpty()){
	// En este caso el elemento que se mostrará es "Hola"
	echo $stack->peek();
}Lenguaje del código: PHP (php)

Un ejemplo típico de uso de una pila es verificar si una palabra dada es palíndromo. Palíndromo es aquella palabra que leída de derecha a izquierda es igual que de izquierda a derecha.

Para hacer esto necesitamos tomar la palabra que queremos verificar. Luego hay que meter cada caracter a un arreglo y posteriormente sacar cada caracter en orden inverso a como se metieron y concatenarlo a otra cadena. Una vez vaciado el arreglo comparamos la palabra original y la cadena que creamos al vaciar el arreglo, si son iguales, la palabra es un palíndromo.

Esta sería la función PHP que comprueba si una palabra es palíndromo o no.

<?php
function isPalindrome(string $word) : bool {
	$cadena = '';
	$pila = new Stack();
	$wordSize = strlen($word);
	for ($i = 0; $i < $wordSize; $i++) {
                $pila->push(substr($word, $i, 1) );
	}
	while ($pila->count() > 0 ) {
		$cadena .= $pila->pop();
	}
	return ($word == $cadena);
}

// Esta linea mostrara un: bool(true)
var_dump(isPalindrome('anitalavalatina');
Lenguaje del código: HTML, XML (xml)

Tambien podrían usarse por separado las funciones nativas array_push() y array_pop() para insertar y sacar respectivamente elementos de un array. Sin embargo, el uso de clases y objetos hace el código más bonito jajaja.

Así que no sean vagos y usen clases.