Código en C para Verificar Palíndromos con Colas y Pilas: Implementación Paso a Paso

Informática4,49 KB

A continuación se presenta un programa en lenguaje C que determina si una palabra es un palíndromo utilizando una cola y una pila, ambas implementadas mediante listas enlazadas dinámicas.

Librerías utilizadas

El programa incluye las siguientes cabeceras:

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>

Definición de estructuras

Estructura de datos de la palabra

struct nodop {
    char palabra[15];
};

Nodo de la cola

struct nodo {
    struct nodop pal;
    struct nodo *siguiente;
};

typedef struct nodo *COLA;

Nodo de la pila

struct nodoPILA {
    struct nodop pal2;
    struct nodoPILA *siguiente2;
};

typedef struct nodoPILA *PILA;

Funciones de la cola

Crear cola

void crear(COLA *inicio, COLA *final) {
    (*inicio) = NULL;
    (*final) = NULL;
}

Verificar si la cola está vacía

int vacia(COLA inicio) {
    if (inicio == NULL)
        return 1;
    else
        return 0;
}

Ingresar elemento en la cola

void ingresar(COLA *inicio, COLA *final, char palabra) {
    COLA nuevo;
    nuevo = (COLA) malloc(sizeof(struct nodo));
    nuevo->pal.palabra[0] = palabra;
    nuevo->siguiente = NULL;
    if ((*final) == NULL) {
        (*final) = nuevo;
        (*inicio) = nuevo;
    } else {
        (*final)->siguiente = nuevo;
        (*final) = (*final)->siguiente;
    }
}

Extraer elemento de la cola

char mostrar(COLA *inicio, COLA *final) {
    COLA q;
    char a;
    a = (*inicio)->pal.palabra[0];
    if ((*inicio)->siguiente == NULL) {
        free(*inicio);
        (*inicio) = NULL;
        (*final) = NULL;
    } else {
        q = (*inicio);
        (*inicio) = (*inicio)->siguiente;
        q->siguiente = NULL;
        free(q);
    }
    return a;
}

Funciones de la pila

Crear pila

void crearPILA(PILA *inicio) {
    (*inicio) = NULL;
}

Ingresar elemento en la pila

void ingresarPILA(PILA *inicio, char palabra) {
    PILA nuevo;
    nuevo = (PILA) malloc(sizeof(struct nodoPILA));
    nuevo->pal2.palabra[0] = palabra;
    nuevo->siguiente2 = NULL;
    if ((*inicio) == NULL) {
        (*inicio) = nuevo;
    } else {
        nuevo->siguiente2 = (*inicio);
        (*inicio) = nuevo;
    }
}

Extraer elemento de la pila

char mostrarPILA(PILA *inicio) {
    PILA q;
    char b;
    b = (*inicio)->pal2.palabra[0];
    if ((*inicio)->siguiente2 == NULL) {
        free(*inicio);
        (*inicio) = NULL;
    } else {
        q = (*inicio);
        (*inicio) = (*inicio)->siguiente2;
        q->siguiente2 = NULL;
        free(q);
    }
    return b;
}

Función principal

void main() {
    struct nodop pal;
    COLA inicio;
    COLA final;
    PILA inicio2;
    char a, b;
    int i, e, igual;
    igual = 0;
    i = 0;
    e = 0;
    clrscr();
    crear(&inicio, &final);
    crearPILA(&inicio2);
    printf("ingresar palabra : ");
    gets(pal.palabra);
    e = strlen(pal.palabra);

    do {
        a = pal.palabra[i];
        ingresar(&inicio, &final, a);
        ingresarPILA(&inicio2, a);
        i++;
    } while (i < e);

    while (!vacia(inicio) && igual == 0) {
        a = mostrar(&inicio, &final);
        b = mostrarPILA(&inicio2);
        printf("\na = %c - b = %c", a, b);

        if (a != b)
            igual = 1;
    }

    if (igual == 1)
        printf("\nNo es palindrome");
    else
        printf("\nSi es palindrome");

    getch();
}

Funcionamiento del programa

El algoritmo recorre la palabra ingresada y almacena cada carácter tanto en la cola como en la pila. Luego, extrae los caracteres de ambas estructuras: la cola entrega los caracteres en el orden original (FIFO), mientras que la pila los entrega en orden inverso (LIFO). Si en algún momento los caracteres extraídos no coinciden, la palabra no es un palíndromo; si todos coinciden, sí lo es.

Conclusión

Este ejemplo muestra cómo combinar estructuras de datos dinámicas, como colas y pilas, para resolver problemas clásicos de procesamiento de cadenas en C, como la detección de palíndromos.

Descargar

PDF Word HTML