回文程序插入';'或'&'时报错,如何实现自动排除特殊符号?
解决回文程序中特殊符号处理及报错问题
咱们先拆解下你代码里导致报错和逻辑异常的核心问题,再给出修复后的完整方案:
主要问题点
- 错误的循环终止条件:你用
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; }
代码优化说明
- 特殊符号过滤:遍历输入字符串时,仅处理大小写字母,其他字符直接跳过,不会进入栈中参与判断。
- 大小写统一:所有大写字母自动转为小写后入栈,确保
Mad!Am这类混合大小写的字符串也能被正确判定为回文。 - 简化栈结构:只保留原始栈和反转栈,通过临时栈复制原始数据,避免修改原栈内容,逻辑更清晰。
- 正确的回文判断:通过同时弹出两个栈的元素逐一对比,只要发现不相等就标记为非回文并终止循环,最终统一输出结果,避免了原代码中重复打印的问题。
现在测试输入mad!am,程序会自动过滤掉!,仅对比m、a、d、a、m,最终输出palindrome ok!;输入Hello!World则会输出not palindrome,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Mang Doog
相关产品推荐
相关产品推荐

