Палиндром c использованием стека

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

 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]!=''){
       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");
}

6 ответов


код


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

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

Я думаю, вы должны изменить " void pop (Stack **head) {"на

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

вы также можете использовать "рекурсию", которая как-то похожа на построение стека, просто это делается для ваших вызовов метода неявно.
Задача палиндрома-Это классическое упражнение для изучения силы рекурсии:)


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

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

это функция, объявленная и определенная:

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

так арг 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]);

ваш код получил проблему на 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]!=''){
        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;
}