You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

回文程序插入';'或'&'时报错,如何实现自动排除特殊符号?

解决回文程序中特殊符号处理及报错问题

咱们先拆解下你代码里导致报错和逻辑异常的核心问题,再给出修复后的完整方案:

主要问题点

  • 错误的循环终止条件:你用k.data[MAX_STACK_SIZE]!=NULL作为while循环判断条件,这完全不对。数组k.data的最大合法索引是MAX_STACK_SIZE-1,访问MAX_STACK_SIZE会触发数组越界;而且char类型数组的初始值不是NULL,这个条件根本没法正确判断栈内是否还有元素。
  • 回文判定逻辑混乱:你把printf("palindrome ok!\n")放在循环内部,会导致每次弹出元素都打印一次;同时循环的终止逻辑错误,容易出现提前退出或死循环的情况。
  • 冗余的栈定义:原代码里定义了三个栈,但实际只需要两个就能完成回文判断,多余的栈会增加代码复杂度。

修复后的完整代码

下面是优化后的代码,已经实现了特殊符号自动过滤、大小写统一处理,并且修正了回文判断的核心逻辑:

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define MAX_STACK_SIZE 100

typedef char element;
typedef struct {
    element data[MAX_STACK_SIZE];
    int top;
} StackType;

void init_stack(StackType* s) {
    s->top = -1;
}

int is_empty(StackType* s) {
    return (s->top == -1);
}

int is_full(StackType* s) {
    return (s->top == (MAX_STACK_SIZE - 1));
}

void push(StackType* s, element item) {
    if (is_full(s)) {
        fprintf(stderr, "栈溢出错误\n");
        return;
    } else
        s->data[++(s->top)] = item;
}

element pop(StackType* s) {
    if (is_empty(s)) {
        fprintf(stderr, "栈空错误\n");
        exit(1);
    } else
        return s->data[(s->top)--];
}

int main(void) {
    StackType original_stack, reversed_stack;
    init_stack(&original_stack);
    init_stack(&reversed_stack);
    
    char input[MAX_STACK_SIZE];
    printf("문자열을 입력하세요: ");
    scanf("%s", input);
    int length = strlen(input);

    // 过滤特殊符号,统一转为小写后存入原始栈
    for (int i = 0; i < length; i++) {
        if ('a' <= input[i] && input[i] <= 'z') {
            push(&original_stack, input[i]);
        } else if ('A' <= input[i] && input[i] <= 'Z') {
            // 大写转小写后入栈,确保大小写不影响判断
            push(&original_stack, input[i] - ('A' - 'a'));
        }
        // 非字母字符直接跳过,不处理
    }

    // 将原始栈元素弹出存入反转栈,得到反转后的字符序列
    StackType temp_stack = original_stack; // 复制原始栈到临时栈,避免修改原栈数据
    while (!is_empty(&temp_stack)) {
        push(&reversed_stack, pop(&temp_stack));
    }

    // 对比原始栈和反转栈的元素,判断是否为回文
    int is_palindrome = 1;
    while (!is_empty(&original_stack) && !is_empty(&reversed_stack)) {
        if (pop(&original_stack) != pop(&reversed_stack)) {
            is_palindrome = 0;
            break;
        }
    }

    // 输出最终判定结果
    if (is_palindrome) {
        printf("palindrome ok!\n");
    } else {
        printf("not palindrome \n");
    }

    return 0;
}

代码优化说明

  1. 特殊符号过滤:遍历输入字符串时,仅处理大小写字母,其他字符直接跳过,不会进入栈中参与判断。
  2. 大小写统一:所有大写字母自动转为小写后入栈,确保Mad!Am这类混合大小写的字符串也能被正确判定为回文。
  3. 简化栈结构:只保留原始栈和反转栈,通过临时栈复制原始数据,避免修改原栈内容,逻辑更清晰。
  4. 正确的回文判断:通过同时弹出两个栈的元素逐一对比,只要发现不相等就标记为非回文并终止循环,最终统一输出结果,避免了原代码中重复打印的问题。

现在测试输入mad!am,程序会自动过滤掉!,仅对比m、a、d、a、m,最终输出palindrome ok!;输入Hello!World则会输出not palindrome,完全符合你的需求。

内容的提问来源于stack exchange,提问作者Mang Doog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 15:37:55