Pregunta

Nuestro profesor nos requiere para comprobar si una palabra es un palíndromo mediante el uso de pilas. Cada vez que lo dirige, hay un error: Unhandled Exception. Access violation ¿Qué estoy haciendo mal? ¿Cómo puedo mejorar mi código? Mi código es el siguiente:

 typedef struct stack{
    char name;
    struct stack * next;
}Stack;

void push(Stack**head, char value);
char pop(Stack**head);


int main(){
   char word[11];
   int i=0;
   int lenght = 0; 
   Stack*head = NULL;
   printf("Please type the word: ");
   scanf("%s", word);
   lenght = strlen(word);
   while(word[i]!='\0'){
       push(&head, word[i]);
       i++;
   }
   i = 0;
   while(pop(&head)==word[i]){
       i++;
   }
   if(i==lenght) printf("The word is a palindrome");
   else printf("The word is not a palindrome");
}
¿Fue útil?

Solución

Su función push debe tener

  • la dirección de la cabeza de la pila (usted tiene que corregir) y
  • el carácter que necesita ser pulsado (que necesita esta fijación).

Así que la firma del método se convierte en:

void push(Stack**head, char value);

y en el cuerpo de la función se agrega value a la parte superior de la pantalla como:

temp->name = value;

También debe comprobar siempre el valor de retorno de malloc.

Dado que va a devolver el valor del hecho estallar pop función de su tipo de retorno no debe ser void, cambiarlo a char tanto en la declaración y la definición como:

char pop(Stack**head)

Hay otro error lógico:

Para empezar se empuja todos los caracteres de la entrada en la pila. A continuación, empezar a aparecer los personajes. No existe una condición de terminación para su estallido. Cuando haya hecho estallar todos los personajes (por lo que su pila está vacía) la siguiente llamada a pop dará lugar a un accidente debido a que estarán eliminación de referencias a un puntero NULL (*head será NULL).

Para solucionar este problema que el pop sólo los caracteres que haya empujado por hacer:

while(i<lenght && pop(&head)==word[i]){

Desde el && está cortocircuitada, pop no será anunciado una vez que haya hecho estallar todos los personajes.

Como alternativa (y enfoque preferido) es escribir otra función llamada de retorno, que isEmpty true / 1 cuando la pila está vacía y el uso de este método antes de llamar al método pop.

Otros consejos

usted debe comprobar rico al final de la pila o no en el código:

while(i < length && pop(&head)==word[i]){
       i++;
   }

Creo que debería cambiar 'pop vacío (Pila ** cabeza) {' en

char pop(Stack **head) {

y también proteger contra pila vacía:

char pop(Stack**head){
Stack* temp;
char val;
temp = *head;
if (!temp) return 0;
val = temp->name;
*head = (*head)->next;
free(temp);
return val;
}

También podría considerar el uso de "recursividad", que es de alguna manera similar a la construcción de una pila, sólo que se realiza para sus llamadas a métodos implícitamente.
El problema palíndromo es un ejercicio clásico para aprender el poder de recursividad:)

Esta es la función que se está llamando que:

push(&head, i, word[i]);

Esta es la función como declara y define:

void push(Stack**head, int i, char value[i]);

Así arg 3 en la declaración es una matriz de caracteres, mientras que arg 3 en la parte llamante es un personaje. Cambiar su push() utilizar un carácter de value y i simplemente omitir:

void push(Stack**head, char value){
    Stack *temp = (Stack*)malloc(sizeof(Stack));
    temp->name = value;
    temp->next = *head;
    *head = temp; 
}

Ahora lo llaman con:

push(&head, word[i]);

su código tiene un problema en la parte while-pop.

Para su conveniencia, he adjuntado el código de trabajo modificado para usted:

typedef struct stack{
    char name;
    struct stack * next;
}Stack;

void push(Stack**head, char value);
char pop(Stack**head);



int main (int argc, const char * argv[]) {


    char word[11];
    int i=0;
    int lenght = 0; 
    Stack*head = NULL;
    printf("Please type the word: ");
    scanf("%s", word);
    lenght = strlen(word);
    while(word[i]!='\0'){
        push(&head, word[i]);
        i++;
        }

    //i = 0;
    //while(pop(&head)==word[i]){
    //  i++;
    //}

    int counter=0;
    i=0;
    for (counter=0; counter<lenght; counter++) {
    if (pop(&head) == word[counter])
    {
        i++;
    }
    }


    if(i==lenght) printf("The word is a palindrome");
    else printf("The word is not a palindrome");


    return 0;
}

void push(Stack**head,char value){

    Stack *temp = (Stack*)malloc(sizeof(Stack));
    temp->name = value;
    temp->next = *head;
    *head = temp; 
}

char pop(Stack**head){

    Stack* temp;

    char val;
    temp = *head;
    val = temp->name;
    *head = (*head)->next;

    free(temp);
    return val;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top