【问题标题】:Error in checking whether a string is palindrome检查字符串是否为回文时出错
【发布时间】:2020-04-27 05:40:26
【问题描述】:

我正在尝试制作一个 C 程序来检查字符序列是否为回文。 我必须使用堆栈和递归函数。

作为输入给出的第一个数字是字符串的长度。该程序在偶数长度下正常工作,但不能识别奇数字符串的回文性。我一直试图找出错误至少一个小时,但没有运气。

这是代码。

#include <stdio.h>
#include <stdlib.h>

struct c {
    char cha;
    struct c *nextPtr;
};

typedef struct c Character;

void push(Character **headPtr, char c) {
    Character *newC = malloc(sizeof(Character));

    if(newC == NULL) {
        puts("Insufficient memory.");
    }
    newC->cha = c;
    newC->nextPtr = *headPtr;
    *headPtr = newC;
}

char pop(Character **headPtr) {
    if(*headPtr != NULL) {
        Character *tempPtr = *headPtr;
        char c = (*headPtr)->cha;
        *headPtr = (*headPtr)->nextPtr;
        free(tempPtr);
        return c;
    }
}

void isPalindrome(int stringLength, int charNum) {
    static Character *headPtr = NULL;

    if(stringLength == 1) {
        puts("Palindrome");
        exit(0);
    }
    if(charNum < (stringLength/2)) {
        char c = getchar();
        push(&headPtr, c);
        return isPalindrome(stringLength, charNum+1);
    }
    if(stringLength % 2) {
        getchar();
    }

    char d = getchar();
    char e = pop(&headPtr);
    if(d != e) {
        puts("Not palindrome");
        exit(0);
    }
    return;
}

int main() {
    int n;

    scanf("%d", &n);
    while(getchar()!='\n');
    isPalindrome(n, 0);

    puts("Palindrome.");
    return 0;
}

您可以自己尝试,只需输入一个奇数,然后输入,而不是一个字符序列。该程序不会识别它是否是回文,并且总是说它不是,甚至会做一些更奇怪的事情,比如根本不输出任何东西并等待更多输入。

我真的不知道我错过了什么。

【问题讨论】:

  • if(*headPtr != NULL) in pop,您不会返回任何内容。它表明您必须打开编译器的警告,因为它会告诉您这一点。这可能会揭示更多问题。
  • if(newC == NULL) in push,你必须return;
  • 为什么将字符序列表示为链表?这太疯狂了。
  • 如果将字符序列表示为字符串,那将是单行:bool pal (const char *s, size_t n){ return n &lt; 2 ? true : s[0] == s[n - 1] &amp;&amp; pal(s + 1, n - 2);}。将其用作bool is_palindrome = pal(s, strlen(s));
  • 不要使用while(something);,因为它会让人们感到困惑,使用更好的while(something) {},甚至更好的while(something) continue;,这样每个人都知道你的空循环是故意的。

标签: c recursion stack


【解决方案1】:

没关系,我自己找到了解决办法。

#include <stdio.h>
#include <stdlib.h>

int isPal = 1;

struct c {
    char cha;
    struct c *nextPtr;
};

typedef struct c Character;

void push(Character **headPtr, char c) {
    Character *newC = malloc(sizeof(Character));

    if(newC == NULL) {
        puts("Insufficient memory.");
        return;
    }
    newC->cha = c;
    newC->nextPtr = *headPtr;
    *headPtr = newC;
}

char pop(Character **headPtr) {
    if(*headPtr != NULL) {
        Character *tempPtr = *headPtr;
        char c = (*headPtr)->cha;
        *headPtr = (*headPtr)->nextPtr;
        free(tempPtr);
        return c;
    }
}

void isPalindrome(int stringLength, int charNum) {
    if(!isPal) return;

    static Character *stack = NULL;

    if(charNum < (stringLength/2)) {
        char c = getchar();
        push(&stack, c);
        isPalindrome(stringLength, charNum+1);
    } else if(stringLength % 2) {
        getchar();
    }

    char d = getchar();
    char e = pop(&stack);
    if(d != '\n' && d != e) isPal = 0;
}

int main() {
    int n;

    if(scanf("%d", &n) != 1 || n < 0) {
        puts("Incorrect input.");
        return 0;
    }
    while(getchar()!='\n');
    if(n>1) isPalindrome(n, 0);

    if(isPal) puts("Palindrome.");
    else puts("Not palindrome.");
    return 0;
}

【讨论】:

  • 您的回答应该说明您的问题是什么以及您是如何解决的。仅仅发布一堆代码可能对未来可能遇到类似问题的读者没有帮助。
猜你喜欢
  • 2012-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多