Título: Palindromo con Pilas
Publicado por: Muffin en 15 Septiembre 2010, 02:50 am
Codifica en Ansi C un programa que realice lo siguiente: - Implemente las funciones push, pop y display para una pila dinámica (utiizando listas enlazadas) de caracteres. - Utilizando las funciones anteriores, el programa debe ser capaz de decir si una cadena de caracteres tecleada por el usuario es palíndrome o no (es palíndrome si se lee igual de izquierda a derecha que de derecha a izquierda). -------------------------------------------------------------- Ya tengo prácticamente el programa pero no me detecta todos los palindromes, algunos me dice que no son cuando si son en que estoy mal??? #include <stdlib.h> #include <stdio.h> #include <windows.h> #include <conio.h>
struct Pila { char dato; struct Pila *Sig; };
typedef struct Pila *Ap;
void push(Ap*, char); void display(Ap); char pop(Ap*); void Palindromo(); void vGotoxy (int, int);
int main() { Ap top; int opc; top = NULL; char palabra[30]; do { system("cls"); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14); vGotoxy(40-strlen("Pilas\n\n")/2,2); printf("Pilas\n\n"); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 13); printf("\n\n\n\t1. Introducir un palindromo \n\t2. Salir \n\n\n\t\t\tOpcion: "); opc = getchar(); switch(opc) { case '1': system("cls"); Palindromo(); break; case '2': system("cls"); vGotoxy(40-strlen("Adeu!!")/2,10); printf("Adeu!!"); break; } }while(opc!='2'); getch(); return 0; }
void Palindromo() { char frase[30], invert[30], letra[20]; int j = 0; Ap Tope; Tope = NULL; fflush(stdin); printf("Escriba un palindromo: \n"); gets(frase); for(int i=0; i<strlen(frase); i++) { if(frase[i] != 32) { letra[j] = frase[i]; push(&Tope, frase[i]); j++; } } display(Tope); for(int k = 0; k<j; k++) { invert[k] = pop(&Tope); } if(strncmp (letra,invert,strlen(invert)) == 0) //strncmp (letra,invert,strlen(invert)) == 0 || strcmp(letra, invert) == 0 printf("Si es un palindromo\n"); else printf("No es un palindromo\n"); getch(); }
void push(Ap *Tope, char pLetra) { struct Pila *x; x = new struct Pila; x->dato = pLetra; x->Sig = *Tope; *Tope = x; }
void display(Ap Tope) { int i = 0; struct Pila *temp; temp = Tope;
while(temp!=NULL) { printf("Letra %d: %c\n", i++, temp->dato); temp = temp->Sig; } }
char pop(Ap *Tope) { char a; if(*Tope == NULL) { printf("PILA VACIA..."); return 0; } else { a = (*Tope)->dato; *Tope = (*Tope)->Sig; return (a); } }
void vGotoxy (int posx, int posy) // Función para centrar en pantalla { HANDLE hConsole=GetStdHandle (STD_OUTPUT_HANDLE); if (INVALID_HANDLE_VALUE !=hConsole) { COORD pos={posx,posy}; SetConsoleCursorPosition (hConsole,pos); } }
Lo siento, está un poco largo.. espero que puedan ayudarme!! Llevo mucho tiempo haciendo esto >.<
Título: Re: Palindromo con Pilas
Publicado por: ricardo_b en 28 Enero 2011, 02:32 am
Ya lo tienes todo!.
Solo, en esta parte esta algo mal:
for(int k = 0; k<j; k++) { invert[k] = pop(&Tope); }
if(strncmp (letra,invert,strlen(invert)) == 0) //strncmp (letra,invert,strlen(invert)) == 0 || strcmp(letra, invert) == 0 printf("Si es un palindromo\n"); else printf("No es un palindromo\n");
---------------------------------------------------------------------------------------------
Tienes que evaluar tu frase inversa y la no inversa, si existe alguna letra que no concuerde con esto ya no es un palidromo, si todas las letras concidieron es palidromo, sustituye lo de arriba por algo asi:
char flag(1); for(int k = 0; k<j; k++) { //Obtiene elemento de la pila invert[k] = pop(&Tope); //Compara la cadena puesta en pila VS la cadena original (sin espacios) if(invert[k] != letra[k]){ flag='F'; } }
Si flag = F no es un palidromo, en caso contrario es un palidromo.
Espero te pueda ayudar asi.
|