2010-12-13 22 views
7

Nuestro profesor nos pidió que comprobásemos si una palabra es un palíndromo utilizando pilas. Cada vez que lo ejecuto, hay un error: Unhandled Exception. Access violation ¿Qué estoy haciendo mal? ¿Cómo puedo mejorar mi código? Mi código es el siguiente:Palindrome Uso de una pila

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"); 
} 
+0

primera: usar 'valor' en lugar de' valor [i] 'en la firma de funciones. – ruslik

Respuesta

7

Su función push debe tomar

  • la dirección de la cabeza de la pila (usted tiene que correcta) y
  • el carácter que necesita ser empujado hacia adentro (esto necesita ser arreglado).

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

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

y en el cuerpo de la función que añadir value a la parte superior de la pantalla como:

temp->name = value; 

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

Dado que va a devolver el valor aparecido desde la función pop es el 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 comenzar, inserte todos los caracteres de la entrada en la pila. A continuación, comienza a hacer estallar los caracteres. No hay una condición de terminación para su estallido. Cuando haya reventado todos los caracteres (para que su pila esté vacía) la siguiente llamada al pop dará lugar a un bloqueo ya que va a desreferenciar un puntero NULL (*head será NULL).

Para solucionar este problema, el pop sólo los caracteres que ha empujado haciendo:

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

Desde el && es cortocircuitada, pop no se llamará una vez que haya hecho estallar todos los personajes.

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

+0

mi segundo error es el valor nulo que no debe ignorarse, ya que debe ser – newbie

+0

@newbie: ver mi respuesta actualizada. – codaddict

+0

tnx mucho :) ahora está funcionando – newbie

1

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

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

Ésta es la función que 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 porción de llamada es un personaje.Cambiar su push() utilizar un carácter de value y simplemente omitir i:

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

Ahora llamarlo con:

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

mi segundo error es el valor nulo que no debe ignorarse, ya que debería ser – newbie

+0

@newbie 'pop()' se declara como una función vacía pero devuelve 'val'. – chrisaycock

+0

se produce otro error al ejecutar el programa – newbie

2

creo que debe cambiar 'pop vacío (Pila ** cabeza) {' en

char pop(Stack **head) { 

y también protegerse 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; 
} 
2

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

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

gracias ... :) – newbie

2

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

1

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

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

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; 
} 
Cuestiones relacionadas