Pila
¿Qué representa este TAD?
Una pila guarda los datos como una torre de platos: agregas y retiras por el tope. El último valor que entra es el primero que sale.
Prueba este ejemplo
Parte de una Pila vacía. En Agregar varios escribe 10, 20, 30 y pulsa Cargar valores. Luego Desapilar debe devolver 30; quedan 20 y 10.
Qué observar · tres pasos
- Ubica el tope antes de ejecutar y predice qué valor saldrá.
- Activa Paso a paso antes de Desapilar y observa cuándo el tope cambia al nodo siguiente.
- Al final, comprueba el valor retirado y que el nodo ya no pertenece a la pila.
Ir a la visualización e ingresar estos datos
De la idea al resultado
- Prepara una operación y predice qué cambiará.
- Activa Paso a paso antes de ejecutar si quieres ver la traza; sin ese modo obtienes el resultado final.
- Relaciona el dibujo con la línea C resaltada: acaba de ejecutarse. Una condición puede no cambiar ningún nodo.
- Lee las pistas de Comprender y las pestañas de Resultados.
Paso anterior / Siguiente paso revisan la misma llamada. Pausar no deshace; cerrar Paso a paso muestra su final sin ejecutarla otra vez. Restablecer TAD (o Reiniciar, según el módulo) borra estructura e historial, no sólo el cursor.
Usa −, +, 100%, Encajar vista y Centrar inicio para acomodar el gráfico. El zoom y el desplazamiento se conservan durante los pasos; la memoria auxiliar es opcional.
Agregar varios valores en esta estructura
Disponible en Pila, Cola, Lista enlazada, Lista circular, ABB, AVL, Rojo-Negro y Montículo binario. En las listas agrega al final. No está disponible para Grafos, Hash, Cola de prioridad ni Sublista; Ordenamiento conserva su propia entrada de arreglo.
- Abre Agregar varios en Preparar. Escribe hasta 50 enteros separados por comas, por ejemplo
8, -3, 12. Se permiten espacios y signos; no decimales, posiciones vacías ni una coma final. Rango: −2147483648 a 2147483647. - Revisa cantidad y orden. Se valida la lista completa antes de empezar. ABB, AVL y Rojo-Negro no aceptan repetidos, ni dentro del lote ni respecto al árbol actual. Pila, Cola, listas y Montículo sí los admiten.
- Elige Cargar valores para añadirlos en orden con resultado final, o Agregar paso a paso para estudiar cada inserción.
- En paso a paso, usa los controles del lote. Reproducir traza sólo reproduce el valor actual; Pausar detiene la reproducción. Al final, pulsa Siguiente valor para aceptar la siguiente inserción, o Finalizar lote al terminar la última.
Al terminar o detener un lote, edita la lista antes de iniciar otro. La vista previa conserva el orden solicitado; el resumen describe ese lote, no sustituye el estado actual tras otra operación o Restablecer TAD.
Detener lote conserva las operaciones ya aceptadas, incluida la actual, y descarta los valores pendientes. No es «deshacer todo». Si falla una operación durante el proceso, las anteriores no se revierten. Si la respuesta es incierta, usa Recargar estado e historial y comprueba qué se guardó antes de volver a cargar valores.
Palabras básicas para leer el dibujo
- TAD
- Tipo abstracto de dato: los datos y las operaciones permitidas sobre ellos.
- Nodo
- Elemento que guarda un valor y enlaces a otros elementos.
- Puntero o enlace
- Referencia que permite llegar a otro nodo. NULL indica que no apunta a un nodo.
- Raíz, padre e hijo
- La raíz inicia el árbol; un padre se conecta con sus hijos.
- Tope, frente y atrás
- Tope (TOP) en Pila; frente (FRONT) y atrás (BACK) en Cola son referencias a sus extremos.
Primera práctica de 5 minutos · Copiar, ampliar y exportar · Resolver dudas y errores · Atajos y referencia
Profundizar: objetivo, reglas y memoria
Objetivo
Predecir inserción y extracción LIFO.
Estrategia
Seguir TOP, aux y el enlace siguiente.
Invariante
TOP es el único extremo; todos los nodos terminan en NULL.
Memoria dinámica
Cada apilar reserva; cada desapilar desconecta antes de liberar.
Errores frecuentes
- Confundir tope (TOP) con el fondo
- Usar aux después de free
Glosario contextual
- Nodo
- Objeto dinámico con datos y uno o más enlaces.
- Enlace
- Campo puntero que conecta objetos.
- Alias
- Dos punteros que designan el mismo objeto.
- LIFO
- El último en entrar es el primero en salir.
- FIFO
- El primero en entrar es el primero en salir.
- Prioridad
- Criterio de selección independiente del orden físico.
- Circularidad
- El último enlace vuelve al inicio.
- malloc
- Reserva memoria; puede devolver NULL.
- free
- Libera una reserva que deja de ser válida.
Alcance de esta pantalla
Usa las operaciones disponibles en el selector. Los auxiliares C pueden no tener un botón propio.
Referencia de operaciones y datos de entrada
Operaciones de la aplicación y datos
- Apilar
apilar - Valor (entero)
- Desapilar
desapilar - Sin datos adicionales.
- Limpiar
limpiar - Sin datos adicionales.
Los métodos C siguientes pueden incluir helpers, utilidades sin botón propio y llamadores equivalentes. Un bloque con varias funciones no cambia el nombre de la operación de la aplicación. Las vistas de memoria usan identidades simbólicas; tras free, sus registros históricos no son punteros utilizables.
Ejecutar operación crea una llamada; Anterior/Siguiente recorren la misma traza. Cerrar y reactivar Paso a paso no vuelven a ejecutar. Las consultas completadas pueden conservarse en el historial o journal aunque no muten la estructura; los rechazos no agregan llamadas exitosas. Restablecer TAD (o Reiniciar, según el módulo) borra la estructura y su historial.
Referencia avanzada por operación
Abre sólo el tema que estás estudiando. Estos detalles distinguen el contrato C, su representación visual y las funciones auxiliares de la aplicación.
Representación, enlaces y consultas
- Estructura LIFO (Last In, First Out): el último nodo en entrar queda en el TOPE y es el primero en salir.
- En la simulación observa cómo se crea el nodo auxiliar, se enlaza al tope actual y luego se reasigna el puntero principal de la pila.
Código fuente completo del TAD
Descarga el archivo C principal de Pila y su encabezado para estudiarlo o compilarlo en tu equipo.
Referencia: estructura del TAD en C
typedef struct NodoPila {
int nro; /**< Dato entero almacenado. */
struct NodoPila *sgte; /**< Enlace al siguiente nodo. */
} *ptrPila;Código C y llamadores equivalentes
Apilar · código C
Reserva un nodo auxiliar, copia el valor, enlaza el nodo al tope actual y actualiza el puntero principal.
/**
* @brief Reserva un nodo y lo publica como nueva cima.
* @param[in,out] p Direccion prestada de la cabeza; NULL se diagnostica sin escritura.
* @param[in] valor Entero a almacenar, incluido -1.
* @pre Si p no es NULL, *p es NULL o una lista propia valida, viva y aciclica.
* @note Fallo malloc imprime diagnostico y conserva *p. Retorno void no comunica exito.
* @note El nodo nuevo pertenece a la pila; destruir o desapilar lo libera. No inicializa una cabeza indeterminada.
*/
void pila_apilar(ptrPila *p, int valor) {
if (p == NULL) {
printf("Error: pila no inicializada.\n");
return;
}
ptrPila aux = (ptrPila) malloc(sizeof(struct NodoPila));
if (aux == NULL) {
printf("Error: No se pudo asignar memoria.\n");
return;
}
aux->nro = valor;
aux->sgte = *p;
*p = aux;
}Desapilar · código C
Valida pila no vacía, extrae el nodo del tope, reasigna el tope al siguiente y libera memoria del nodo removido.
/**
* @brief Copia el dato de cima, actualiza la cabeza y libera el nodo retirado.
* @param[in,out] p Direccion prestada de cabeza o NULL.
* @return Dato retirado; -1 ante p NULL o *p NULL con diagnostico en stdout. -1 tambien es un dato valido.
* @pre Si hay nodos, deben ser vivos, propios y formar una lista aciclica.
* @note No reserva memoria. Los aliases al nodo retirado quedan invalidos. Comprobar no vacia antes de usar el retorno como dato.
*/
int pila_desapilar(ptrPila *p) {
if (p == NULL || *p == NULL) {
printf("Pila vacía. No se puede desapilar.\n");
return -1; // Valor de error
}
ptrPila aux = *p;
int num = aux->nro;
*p = aux->sgte;
free(aux);
return num;
}Limpiar · código C
Recorre la estructura liberando todos los nodos y deja el puntero raíz en estado nulo para reinicio seguro.
/**
* @brief Libera todos los nodos y deja la cabeza en NULL.
* @param[in,out] p Direccion de lista propia viva y aciclica; NULL se ignora.
* @note No reserva ni imprime. Los aliases a nodos liberados dejan de ser validos; una copia externa de la cabeza no se actualiza.
*/
void pila_destruir(ptrPila *p) {
ptrPila aux;
if (p == NULL) {
return;
}
while (*p != NULL) {
aux = *p;
*p = aux->sgte;
free(aux);
}
}Consultar tope (auxiliar sin botón propio) · código C
Consulta el valor del tope sin retirar el nodo. En C, −1 también puede ser un dato válido: no lo uses por sí solo para decidir si la pila está vacía.
/**
* @brief Consulta el dato de cima sin cambiar enlaces.
* @param[in] p Cabeza prestada viva o NULL.
* @return Dato de cima o -1 si p es NULL; -1 no distingue vacio de dato almacenado.
* @note No reserva, libera ni imprime. No valida punteros colgantes.
*/
int pila_cima(ptrPila p) {
return p == NULL ? -1 : p->nro;
}Mostrar · código C
Recorre la estructura para construir una salida ordenada sin alterar enlaces internos.
/**
* @brief Imprime los datos de cima a fondo sin modificar nodos.
* @param[in] p Lista prestada viva, aciclica o NULL.
* @note NULL imprime el mensaje de pila vacia; cada dato se imprime con tabulacion y salto de linea. No reserva ni libera.
*/
void pila_mostrar(ptrPila p) {
ptrPila aux = p;
if (aux == NULL) {
printf("Pila vacia.\n");
return;
}
while (aux != NULL) {
printf("\t%d\n", aux->nro);
aux = aux->sgte;
}
}