回文使用堆栈

前端之家收集整理的这篇文章主要介绍了回文使用堆栈前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们的教授要求我们通过使用堆栈来检查单词是否是回文.
每次运行它都会出现错误:未处理的异常.访问违规我做错了什么?我怎样才能改进我的代码?我的代码如下:
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");
}

解决方法

你的推送功能应该采取

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

所以方法签名变为:

void push(Stack**head,char 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方法之前使用此方法.

猜你在找的C&C++相关文章