首页 > 解决方案 > 检查字符串是否为回文时出错

问题描述

我正在尝试制作一个 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;
}

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

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

标签: crecursionstack

解决方案


没关系,我自己找到了解决方案。

#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;
}

推荐阅读