Pregunta

Buen día! Nuestro profesor nos requiere para determinar si una palabra o una serie de número es un palíndromo o no el uso de pilas. Ya terminé de hacer eso. Pero quiero practicar más aún en este momento estoy tratando de determinar si una sentencia es un palíndromo o no mediante la eliminación de espacios en blanco y otros caracteres no pertinentes (Nota: No es parte de mi tarea más) Mi código ya está trabajando (con suerte) pero encuentro es desordenado. Así que quiero mejorarlo. Quiero eliminar la función Goto porque mi profesor me aconsejó no utilizarlo. ¿Cómo puedo salir de la instrucción if w / o utilizando la función Goto? Gracias de antemano. También hay otras maneras de hacerlo verificación si una oración es un palíndromo o no, porque mi código se realiza en un método de fuerza bruta. Mi código es el siguiente: NOTA (no me incluyo / pegado el struct y la función pop y empuje aquí)

int main(){
   char word[11];
   char temp[11];
   char value;
   int i=0, x=0, n=0, length=0; 
   Stack*head = NULL;
   printf("Please type the word: ");
   gets(word);
   length = strlen(word);
   while(i<length){
       if(isspace(word[i]) || !isalpha(word[i]))  {
           if(isdigit(word[i])) goto NEXT;  // i used the goto function here
           i++; 
           continue;
       }
       NEXT:
       temp[n]=word[i];
       push(&head, word[i]);
       i++;
       n++;
   }
   temp[n]='\0';
   while(x<n){
       value = pop(&head);         
       if (value==temp[x]){ 
           x++; 
           continue;
       }
       break;
   }    
   if(x==n) printf("Yehey! It is a palindrome.");
   else printf("Sorry, It is not a palindrome.");
   getch();
}

Sobre la base de sus sugerencias. Aquí está mi código mejorada:

int main(){
   char word[11];
   char temp[11];
   int i=0, n=0; 
   int flag = 1;
   Stack*head = NULL;
   printf("Please type the word: ");
   fgets(word, 11, stdin);
   for(i = 0; word[i]!='\0' ; i++){
       if(isalnum(word[i])) {
           temp[n]=word[i];
           push(&head, word[i]);
           n++;
       }
   }
   temp[n]='\0';
   for(i=0; temp[i]!='\0'; i++){
       if (pop(&head)!=temp[i]){ 
          flag = 0;
          break;
       }
   }    
   if (flag==1) printf("Yehey! It is a palindrome.");
   else printf("Sorry, It is not a palindrome.");
   getch();
}
¿Fue útil?

Solución

Me gusta su actitud.

En primer lugar, lo que está tratando de hacer aquí es nido de dos estados lógicos que son esencialmente uno. También está usando las funciones erróneas para determinar el tipo de caracteres:

Si isspace(word[i]) entonces usted puede garantizar que !isalpha(word[i]). Ambas afirmaciones siempre será verdadero o falso al mismo tiempo, por lo que uno de ellos es redundante. Lo que está haciendo en realidad sólo se está empujando caracteres alfanuméricos si el son, ¿verdad? Así que en lugar de tener una sentencia if para determinar si desea omitir un personaje que debería estar haciendo una sentencia if para determinar si usted quiere empujar el carácter. Creo isalnum() podría ser lo que quiera.

En segundo lugar, en vez de hacer strlen () que itera sobre la cuerda y utilizando el valor de retorno para iterar sobre la cadena (que hace que dos veces) Proveedores:

while('\0' != word[i])

o incluso mejor:

for(i = 0; '\0' != word[i]; i++)

Por último, la prueba de un palíndromo podría neatened un poco. La prueba de un valor de bucle después del bucle funciona en todos los casos, pero es un poco feo. Asimismo, no soporta a los tontos. En un entorno profesional se obtiene mucha gente, algunos no tan concienzudo, editar el código, y el uso de valores de asa después de un bucle puede ser arriesgado. Tal vez tenga un bool llamado algo así como "partido" y se inician a true, entonces bucle hasta el final de la pila o "partido" se vuelve falsa y set de "partido" en false si el personaje en la pila no "compatibles" con las valor esperado. Esto también será más eficiente.


Yo estaba en el medio de la composición de esta respuesta cuando la pregunta original, aparentemente se borraron.

Si usted quiere que yo para poner un ejemplo de código que estoy feliz de hacerlo, pero piensa que podría obtener más si no lo hago. Si quieres un ejemplo de código, o quieres que echar un vistazo a lo que te ocurrió después de esta respuesta, no dude.

Otros consejos

El cambio más sencillo que se puede hacer es la siguiente:

   ...
   if(isspace(word[i]) || !isalpha(word[i]))  {
       if(!isdigit(word[i])) {
           i++; 
           continue;
        }
   }
   temp[n]=word[i];
   ...

Hay algunas otras cosas que usted puede hacer para poner en orden el código (por ejemplo, combinar las declaraciones if, deshacerse de la isspace ya cubiertas !isalpha eso y así sucesivamente).

Yo sólo miró over..might ser malentendido:

while(i<length){
   if(isalnum(word[i]))  {
       temp[n]=word[i];
       push(&head, word[i]);
       n++;

   }
   i++;

}

Para un salto corto tal, es trivial para re-escritura para eliminar el problema.

while(i<length){
   if(isspace(word[i]) || !isalpha(word[i]))  {
       if(!isdigit(word[i])) {
           i++;
           continue;
       }
   }
   temp[n]=word[i];
   push(&head, word[i]);
   i++;
   n++;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top