Autor Tema: Programa saber si una palabra es Palindromo con Pilas (Stack) en C lenguajeC  (Leído 6098 veces)

Alejandra Mirano

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 9
    • Ver Perfil
Hola necesito orientación para saber porque se imprimen caracteres extraños que no son los que quiero que se impriman, además de tener problemas con hacer la comparación de caracteres para saber si es palíndromo o no la palabra. Si me pudieran ayudar se los agradecería. Gracias.

Código: [Seleccionar]
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct elemento{
char dato[30];
struct elemento *siguiente;
};

typedef struct elemento Nodo;

Nodo*crearPila();
int pilaVacia(Nodo *cima);
void insertar(char *x, Nodo **cima);
void eliminar(Nodo **cima);
void imprimePila(Nodo **cima);
void insertarPalindromo(char *x, Nodo **cima);
void extraer(Nodo **cima);
main(){
char texto[30];
Nodo *cima;
printf("Inserte palindromo: ");
scanf("%s", texto );
insertarPalindromo(texto,&cima);

}

Nodo* crearPila(){
Nodo *cima;
cima=NULL;
printf("Pila creada. \n");
return cima;
}

int pilaVacia(Nodo *cima){
if(cima==NULL){
return 1; //regresa 1 si es vacía
}else
return 0; //regresa 0 si no es vacía
}

void insertar(char *x, Nodo **cima){
//fflush(stdin);//inserta al inicio de la lista
printf("\nPush(insertar): %c\n",x);
Nodo *nuevo;
nuevo = (Nodo *) malloc (sizeof(Nodo));
nuevo->dato,x;//
nuevo->siguiente=*cima;
*cima=nuevo;

}

void eliminar(Nodo **cima){ //elimina del inicio de la lista
    printf("\nPop (eliminar)\n");
if(pilaVacia(*cima)==1){
printf("Error al eliminar: no hay elementos en la pila.\n\n");
}else{
Nodo *actual;
actual=*cima;
*cima=actual->siguiente;
if(strcmp(actual->dato,actual->dato)==0){  /*aquí tengo problemas con la
 comparación de caracteres*/
printf("Coinciden dato %c y %c !!!\n", actual->dato, actual->dato); /*aquí se imprimen caracteres extraños*/
}else{
printf("NO es palindromo!!!");

}
free(actual);

}
}

void imprimePila(Nodo **cima){
Nodo *actual;
actual=*cima;

if(pilaVacia(*cima)==1){
printf("Error al imprimir: no hay elementos en la pila.\n\n");
}else{
printf("-------PILA--------\n");
while(actual != NULL){
//fflush(stdin);
printf("%c \n",actual->dato);// aquí se imprimen caracteres extraños
actual = actual->siguiente;
}
printf("-------------------\n");
}
}

void insertarPalindromo(char *x, Nodo **cima){
crearPila();
Nodo *nuevo;
nuevo=*cima;
printf("%s\n",x);
int i=0;
char palindromo [strlen(x)];
for(i=0; i<strlen(x); i++){
insertar(x[i], &*cima); //hasta aca todo bien
}
while(pilaVacia(*cima)==0){
i--;
eliminar(&*cima);
imprimePila(&*cima);
}

printf("La palabra es palindromo ");
}


« Última modificación: 17 de Enero 2021, 20:19 por Ogramar »

mark255

  • Sin experiencia
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Palindromo con Pilas en C.
« Respuesta #1 en: 07 de Noviembre 2020, 20:04 »
Hola Alejandra, te comento lo que voy viendo y quizás quieras cambiar:

- Veo que no pones retorno en main y los paréntesis vacíos   de los prototipos y definiciones no llevan void como mandan   los cánones
- en [crear pila] no veo que reserves memoria, con lo que cima   es una variable temporal que desaparece al salir de la función   es decir solo sirve para imprimir y devolver un null que no usas,   puedes sustituirla por: printf("Pila creada."); es lo mismo
- [main] lo usas para llamar a insertar palíndromo y no la usas para   que contenga la lógica principal del programa
- en [pila vacía] la usas para preguntar por ella en vez de  preguntar por null que es lo mismo
- no se bien la lógica que pretendes pues si solo introduces una   palabra para que necesitas una pila, es que vas a introducir varias palabras o lo que quieres es tener un carácter en cada nodo ya que dato es un string y intentas visualizar un carácter
  enviando un puntero  :(
- en [insertar palíndromo] además de crear las variables en cualquier lado, primero eliminas el nodo y luego imprimes  ???


Bueno no lo he revisado a fondo pero en general deberías hacerte un
diagrama de flujo con el algoritmo que pretendes usar y ver ahí que
todo va bien, depuralo y luego pasalo a código, te ira todo mucho mejor

 
te paso el enlace a unos videos de estructuras de datos que puede te de
una muy buena orientación a las listas

 
mucha suerte Alejandra  :)
chao chao
 
« Última modificación: 17 de Enero 2021, 20:17 por Ogramar »

mark255

  • Sin experiencia
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Palindromo con Pilas en C.
« Respuesta #2 en: 07 de Noviembre 2020, 22:10 »
hola alejandra
te paso un código para saber si es palíndromo hecho sin pilas

Código: [Seleccionar]
enum { no, si };

#define TAM 30          // longitud máxima de la palabra

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

int main(void)
{
   char cadena[TAM];    // guarda la palabra
   int  es_pal = si;    // bandera de si es palíndromo

   // petición de la palabra
   printf("Introduzca una palabra y le diré si es un palíndromo: ");
   scanf("%s", cadena);

   // determina si es palíndromo
   for(int i = 0, j = strlen(cadena)-1; i<j; i++, j--)
      if(cadena[i] != cadena[j]) { es_pal = no; break; }
     
   // visuliza si es palíndromo
   printf("La palabra %s %ses un plalíndromo\n", cadena, es_pal ? "" : "no ");

   return 0;            // finalización correcta del programa
}

/* en respuesta a alejandra
   https://aprenderaprogramar.com/foros/index.php?topic=7795.0

   de mark255
*/

link del código

lo que no entiendo es como quieres hacer el programa con una pila ya que si piensas en los caracteres como platos de una pila,

como vas a comparar el primero con el último ??

para llegar al primero tienes que sacarlos todos  ya que esta abajo en la pila ¿?

suerte ;-)
« Última modificación: 17 de Enero 2021, 20:16 por Ogramar »

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".