C语言编程题判断回文字符串

编写一个C语言程序,判断一个字符串是否是回文字符串。回文字符串是指正读和反读都相同的字符串,例如 level 和 radar 都是回文字符串。不同的思路和技术,包括双指针法、递归、辅助数组、栈以及忽略大小写和非字母字符的判断。根据不同的需求和限制条件,可以选择适合的方法来判断回文字符串。

1、双指针法

双指针法是一种高效的判断回文字符串的方法,它利用了回文字符串的对称性特点。该方法使用两个指针,分别指向字符串的首尾,逐个比较字符串中对应位置的字符。如果所有对应位置的字符都相等,则字符串是回文字符串;否则,字符串不是回文字符串。

#include <stdio.h>
#include <string.h>

// 判断字符串是否为回文字符串的函数
int isPalindrome1(char str[]) {
    int left = 0;
    int right = strlen(str) - 1;

    while (left < right) {
        if (str[left] != str[right]) {
            return 0; // 不是回文字符串
        }
        left++;
        right--;
    }
    return 1; // 是回文字符串
}

int main() {
    char str[100];

    printf("请输入一个字符串: ");
    scanf("%s", str);

    if (isPalindrome1(str)) {
        printf("字符串 \"%s\" 是回文字符串。\n", str);
    } else {
        printf("字符串 \"%s\" 不是回文字符串。\n", str);
    }

    return 0;
}

2、递归法

递归法是一种用于判断回文串(palindrome)的算法,它通过将问题分解为更小的子问题并使用相同的函数来解决它们来实现。该方法的核心思想是检查字符串的最左边和最右边字符是否相等,并递归地调用自身来检查字符串的剩余部分。

#include <stdio.h>
#include <string.h>

// 递归判断字符串是否为回文字符串的函数
int isPalindrome2(char str[], int left, int right) {
    if (left >= right) {
        return 1; // 是回文字符串
    }
    if (str[left] != str[right]) {
        return 0; // 不是回文字符串
    }
    return isPalindrome2(str, left + 1, right - 1);
}

int main() {
    char str[100];

    printf("请输入一个字符串: ");
    scanf("%s", str);

    if (isPalindrome2(str, 0, strlen(str) - 1)) {
        printf("字符串 \"%s\" 是回文字符串。\n", str);
    } else {
        printf("字符串 \"%s\" 不是回文字符串。\n", str);
    }

    return 0;
}

3、使用辅助数组

辅助数组法是一种用于判断回文串(palindrome)的算法,它通过创建一个辅助数组来存储原始字符串的逆序,然后比较这两个数组来确定它们是否相等来实现。这种方法相对简单易懂。

#include <stdio.h>
#include <string.h>

// 判断字符串是否为回文字符串的函数
int isPalindrome3(char str[]) {
    int len = strlen(str);
    char reversed[len + 1];

    for (int i = 0; i < len; i++) {
        reversed[i] = str[len - 1 - i];
    }
    reversed[len] = '\0';

    return strcmp(str, reversed) == 0;
}

int main() {
    char str[100];

    printf("请输入一个字符串: ");
    scanf("%s", str);

    if (isPalindrome3(str)) {
        printf("字符串 \"%s\" 是回文字符串。\n", str);
    } else {
        printf("字符串 \"%s\" 不是回文字符串。\n", str);
    }

    return 0;
}

4、使用栈

栈法是一种用于判断回文串(palindrome)的算法,它利用栈数据结构存储字符串一半的字符,然后将它们与另一半的相应字符进行比较。这种方法高效,并利用了栈的 LIFO(Last In, First Out)原则来有效地检查回文串。

#include <stdio.h>
#include <string.h>

// 判断字符串是否为回文字符串的函数
int isPalindrome4(char str[]) {
    int len = strlen(str);
    char stack[len];
    int top = -1;

    for (int i = 0; i < len; i++) {
        stack[++top] = str[i];
    }

    for (int i = 0; i < len; i++) {
        if (str[i] != stack[top--]) {
            return 0; // 不是回文字符串
        }
    }
    return 1; // 是回文字符串
}

int main() {
    char str[100];

    printf("请输入一个字符串: ");
    scanf("%s", str);

    if (isPalindrome4(str)) {
        printf("字符串 \"%s\" 是回文字符串。\n", str);
    } else {
        printf("字符串 \"%s\" 不是回文字符串。\n", str);
    }

    return 0;
}

5、忽略大小写和非字母字符

为了在C语言中忽略大小写和非字母字符检查回文串,可以修改现有的回文串检查算法来处理这些情况。

#include <stdio.h>
#include <ctype.h>
#include <string.h>

// 判断字符是否为字母
int isAlpha(char c) {
    return isalpha(c);
}

// 判断字符串是否为回文字符串的函数(忽略大小写和非字母字符)
int isPalindrome5(char str[]) {
    int left = 0;
    int right = strlen(str) - 1;

    while (left < right) {
        if (!isAlpha(str[left])) {
            left++;
        } else if (!isAlpha(str[right])) {
            right--;
        } else if (tolower(str[left]) != tolower(str[right])) {
            return 0; // 不是回文字符串
        } else {
            left++;
            right--;
        }
    }
    return 1; // 是回文字符串
}

int main() {
    char str[100];

    printf("请输入一个字符串: ");
    scanf("%s", str);

    if (isPalindrome5(str)) {
        printf("字符串 \"%s\" 是回文字符串。\n", str);
    } else {
        printf("字符串 \"%s\" 不是回文字符串。\n", str);
    }

    return 0;
}

推荐阅读
cjavapy编程之路首页