#include
#include
#include
#include
struct NodoPila {
char caracter;
struct NodoPila* siguiente;
};
struct NodoCola {
char caracter;
struct NodoCola* siguiente;
};
void apilar(struct NodoPila** pila, char c) {
struct NodoPila* nuevoNodo = (struct NodoPila*)malloc(sizeof(struct NodoPila));
nuevoNodo->caracter = c;
nuevoNodo->siguiente = *pila;
*pila = nuevoNodo;
}
char desapilar(struct NodoPila** pila) {
if (*pila == NULL) return '\0';
struct NodoPila* temp = *pila;
char c = temp->caracter;
*pila = temp->siguiente;
free(temp);
return c;
}
void encolar(struct NodoCola** cola, char c) {
struct NodoCola* nuevoNodo = (struct NodoCola*)malloc(sizeof(struct NodoCola));
nuevoNodo->caracter = c;
nuevoNodo->siguiente = NULL;
if (*cola == NULL) {
*cola = nuevoNodo;
} else {
struct NodoCola* temp = *cola;
while (temp->siguiente != NULL) {
temp = temp->siguiente;
}
temp->siguiente = nuevoNodo;
}
}
char desencolar(struct NodoCola** cola) {
if (*cola == NULL) return '\0';
struct NodoCola* temp = *cola;
char c = temp->caracter;
*cola = temp->siguiente;
free(temp);
return c;
}
void eliminarSaltoDeLinea(char *cadena) {
int i = 0;
while (cadena[i] != '\0') {
if (cadena[i] == '\n') {
cadena[i] = '\0';
break;
}
i++;
}
}
int esPalindromo(char* frase) {
struct NodoPila* pila = NULL;
struct NodoCola* cola = NULL;
int i = 0;
while (frase[i] != '\0') {
if (isalpha(frase[i])) {
char c = tolower(frase[i]);
apilar(&pila, c);
encolar(&cola, c);
}
i++;
}
while (pila != NULL && cola != NULL) {
char c1 = desapilar(&pila);
char c2 = desencolar(&cola);
if (c1 != c2) {
while (pila != NULL) desapilar(&pila);
while (cola != NULL) desencolar(&cola);
return 0;
}
}
return 1;
}
int main() {
char frase[256];
while (1) {
printf("Introduce una frase (o '#' para terminar): ");
fgets(frase, sizeof(frase), stdin);
eliminarSaltoDeLinea(frase);
if (strcmp(frase, "#") == 0) {
break;
}
if (esPalindromo(frase)) {
printf("La frase es un palindromo.\n");
} else {
printf("La frase NO es un palindromo.\n");
}
}
return 0;
}