回文使用堆栈

new*_*bie 7 c stack palindrome data-structures

我们的教授要求我们通过使用堆栈检查一个单词是否是回文.每次我运行它都会出错: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]!='\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");
}
Run Code Online (Sandbox Code Playgroud)

cod*_*ict 7

你的push功能应该采取

  • 堆栈头的地址(你说它是正确的)和
  • 需要推入的角色(这需要修复).

所以方法签名变为:

void push(Stack**head, char value);
Run Code Online (Sandbox Code Playgroud)

并在函数体中添加value到堆栈顶部:

temp->name = value;
Run Code Online (Sandbox Code Playgroud)

您还必须始终检查返回值malloc.

由于您从函数返回弹出的值,pop它的返回类型不能是void,char在声明和定义中将其更改为:

char pop(Stack**head)
Run Code Online (Sandbox Code Playgroud)

还有另一个逻辑错误:

首先,将输入的所有字符推入堆栈.接下来,您开始弹出角色.弹出没有终止条件.当您弹出所有字符(因此您的堆栈为空)时,下一次调用pop将导致崩溃,因为您将取消引用NULL指针(*head将是NULL).

要解决这个问题,你只需弹出你所推动的角色:

while(i<lenght && pop(&head)==word[i]){
Run Code Online (Sandbox Code Playgroud)

由于&&短路,pop一旦弹出所有字符就不会被调用.

或者(和首选方法)是编写另一个函数isEmpty,该函数在堆栈为空时返回true/ 返回1,并在调用方法之前使用此pop方法.