Pila

Descripcion del TAD

Estructura LIFO (Last In, First Out): el ultimo nodo en entrar queda en el TOPE y es el primero en salir. En la simulacion observa como se crea el nodo auxiliar, se enlaza al tope actual y luego se reasigna el puntero principal de la pila. La Pila (LIFO) modela escenarios donde el ultimo elemento agregado es el primero en salir. En C se implementa con nodos enlazados y un puntero al tope; por eso la simulacion enfatiza creacion de auxiliares, reasignacion de punteros y liberacion de 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.

Controles de ejecucion paso a paso

Operaciones soportadas

Operaciones pendientes / restricciones

No hay operaciones pendientes para esta estructura en esta fase.

Estructura del TAD en C

typedef struct NodoPila {
    int nro;                  
    struct NodoPila *sgte;    
} *ptrPila;

Metodos del TAD en C

Codigo C: apilar

Reserva un nodo auxiliar, copia el valor, enlaza el nodo al tope actual y actualiza el puntero principal.

/**
 * @brief Apila un nuevo valor en la pila.
 * @param p Puntero a la pila.
 * @param valor Valor entero que se apilará.
 */
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;
}

Codigo C: desapilar

Valida pila no vacia, extrae el nodo del tope, reasigna el tope al siguiente y libera memoria del nodo removido.

/**
 * @brief Desapila y devuelve el valor en la cima de la pila.
 * @param p Puntero a la pila.
 * @return int Valor desapilado.
 */
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;
}

Codigo C: limpiar

Recorre la estructura liberando todos los nodos y deja el puntero raiz en estado nulo para reinicio seguro.

/**
 * @brief Elimina todos los elementos de la pila.
 * @param p Puntero a la pila.
 */
void pila_destruir(ptrPila *p) {
    ptrPila aux;
    if (p == NULL) {
        return;
    }

    while (*p != NULL) {
        aux = *p;
        *p = aux->sgte;
        free(aux);
    }
}

Codigo C: cima

Este metodo del TAD Pila debe interpretarse respetando condicionales, ciclos, returns y actualizacion del estado visual segun el flujo real del codigo C.

int pila_cima(ptrPila p) {
    return p == NULL ? -1 : p->nro;
}

Ir a la visualizacion