7

我们的教授要求我们使用堆栈来检查一个单词是否是回文。每次我运行它,都会出现一个错误: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");
}
4

6 回答 6

7

你的push功能应该采取

  • 堆栈头的地址(你说得对)和
  • 需要推入的角色(这需要修复)。

所以方法签名变成:

void push(Stack**head, char value);

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

temp->name = value;

此外,您必须始终检查malloc.

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

char pop(Stack**head)

还有一个逻辑错误:

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

要解决此问题,您只需弹出您通过执行以下操作推送的字符:

while(i<lenght && pop(&head)==word[i]){

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

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

于 2010-12-13T06:29:01.370 回答
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;
}
于 2010-12-13T06:38:15.177 回答
2

你应该在你的代码中检查你是否丰富了堆栈的结尾:

while(i < length && pop(&head)==word[i]){
       i++;
   }
于 2010-12-13T06:45:29.580 回答
2

您也可以考虑使用类似于构造堆栈的“递归”,只是它是为您的方法调用隐式完成的。
回文问题是学习递归能力的经典练习:)

于 2010-12-13T07:36:48.573 回答
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]);
于 2010-12-13T06:30:24.017 回答
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;
}
于 2010-12-13T07:38:25.443 回答