Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Muffin en 15 Septiembre 2010, 02:50 am



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???
Código:
#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.