回文使用堆栈

时间:2010-12-13 06:25:41

标签: c data-structures palindrome stack

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

6 个答案:

答案 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;
}