我们的教授要求我们通过使用堆栈来检查单词是否是回文。
每次我运行它都会出错: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");
}
答案 0 :(得分: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
并在调用{{1}之前使用此方法方法。
答案 1 :(得分:2)
我认为你应该将'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;
}
答案 2 :(得分:2)
你应该在你的代码中检查你是否丰富了堆栈的结尾:
while(i < length && pop(&head)==word[i]){
i++;
}
答案 3 :(得分:2)
你也可以考虑使用“recursion”,它与构造一个堆栈类似,只是隐含地为你的方法调用完成了。 回文问题是学习递归力量的经典练习:)
答案 4 :(得分:1)
这是您调用的功能:
push(&head, i, word[i]);
这是声明和定义的函数:
void push(Stack**head, int i, char value[i]);
声明中的arg 3是一个字符数组,而调用部分中的arg 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]);
答案 5 :(得分: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;
}