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)
你的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
方法.