2010-12-13 2 views
7

Наш профессор потребовал от нас проверить, является ли слово палиндром, используя стеки. Каждый раз, когда я запускаю его, возникает ошибка: Unhandled Exception. Access violation Что я делаю неправильно? Как я могу улучшить свой код? Мой код выглядит следующим образом:Palindrome Использование стека

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

первых один: использовать 'value' вместо' значения [я] 'в подписи функций. – ruslik

ответ

7

Ваша push функция должна принимать

  • адрес главы стека (вы имеете его правильно) и
  • символ, который должен быть нажат (это требует фиксации).

Так метод подписи становится:

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

и в теле функции добавления value к вершине стека как:

temp->name = value; 

Кроме того, вы всегда должны проверить возвращение значение malloc.

Поскольку вы возвращаете выскочил значение из функции pop это тип возвращаемого значения не должны быть void, изменить его char как в декларации и определения, как:

char pop(Stack**head) 

Существует еще одна логическая ошибка:

Чтобы начать с вас, введите все символы ввода в стек. Затем вы начнете выскакивать символы. Не существует условий для завершения вашего всплытия. Когда вы вытащили все символы (так что ваш стек пуст), следующий вызов pop приведет к сбою, так как вы будете разыменовывать указатель NULL (*head будет NULL).

Чтобы исправить это, вы поп только символы вы толкнул, выполнив:

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

Поскольку && короткое замыкание, pop не будет называться, как только вы совал все символы.

В качестве альтернативы (и предпочтительный подход), чтобы написать другую функцию под названием isEmpty, которые возвращают true/1, когда стек пуст, и использовать этот метод перед вызовом метода pop.

+0

моя вторая ошибка - это пустое значение, которое нельзя игнорировать, поскольку оно должно быть – newbie

+0

@newbie: см. Мой обновленный ответ. – codaddict

+0

tnx много :) теперь он работает – newbie

1

Это функция, как вы вызываете его:

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

Это функция, как заявлено и определены:

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

Так Arg 3 в декларации является массив символов, в то время как аргумент 3 в вызывающей части является символом.Изменение push() использовать символ для value и просто опустить i:

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

Позовите его:

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

моя вторая ошибка - это пустое значение, которое нельзя игнорировать, поскольку оно должно быть – newbie

+0

@newbie 'pop()' объявляется как функция void, но возвращает 'val'. – chrisaycock

+0

другая ошибка возникает при запуске программы – newbie

2

Я думаю, вы должны изменить Пустота поп (Stack ** головы) { 'в

char pop(Stack **head) { 

, а также защиты от пустого стека:

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

вы должны проверить, вы богатый конец стека или нет в вашем коде:

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

спасибо ... :) – newbie

2

Вы могли бы также рассмотреть возможность использования «рекурсии», который как-то похоже на построение стека, так что это делается для вашего метод неявно.
Проблема с палиндром - это классическое упражнение для изучения силы рекурсии :)

1

Ваш код имеет проблему на while-pop.

Для Вашего удобства, я приложил модифицированный рабочий код для вас:

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