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

  1. Ubica el tope antes de ejecutar y predice qué valor saldrá.
  2. Activa Paso a paso antes de Desapilar y observa cuándo el tope cambia al nodo siguiente.
  3. 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

  1. Prepara una operación y predice qué cambiará.
  2. Activa Paso a paso antes de ejecutar si quieres ver la traza; sin ese modo obtienes el resultado final.
  3. Relaciona el dibujo con la línea C resaltada: acaba de ejecutarse. Una condición puede no cambiar ningún nodo.
  4. 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.

  1. 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.
  2. 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.
  3. Elige Cargar valores para añadirlos en orden con resultado final, o Agregar paso a paso para estudiar cada inserción.
  4. 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

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;
    }
}

Ir a la visualización