基于Stack实现回文检查器遇异常:pop函数工作不符合预期
问题分析与修复
你的代码存在两个关键问题,直接导致了pop行为异常和回文判断失效:
1. 重复调用pop()导致栈元素被过度消耗
第二个循环里,你每次循环都调用了两次pop():一次用于打印输出,另一次用于判断字符匹配。这会让栈顶指针top每次循环递减两次——原本入栈的2个元素,第一次循环弹出1个后,第二次循环再调用pop()时,top已经变成-2,访问的是栈的非法内存区域,所以输出空字符。
2. 字符串后半部分索引越界
你用s[n-i]获取对称位置的字符,但字符串索引从0开始,最大有效索引是n-1,s[n-i]会直接越界,正确的对称位置应该是s[n-1 - i]。
修复后的完整代码
#include<stdio.h> #include<string.h> int top = -1; char pop(char stack[]) { return stack[top--]; } void push(char item, char stack[]) { stack[++top] = item; } int main() { int n, count = 0; char stack[50], s[50], popped_char; printf("enter string: "); scanf("%s", s); n = strlen(s); printf("len is %d\n", n/2); // 字符串前半部分入栈 for(int i = 0; i < n/2; i++) { push(s[i], stack); } // 弹出栈元素与后半部分字符匹配 for(int i = 0; i < n/2; i++) { popped_char = pop(stack); printf("pop is : %c\n", popped_char); if(s[n-1 - i] == popped_char) { count++; } } printf("count is %d\n", count); if (count == n/2) { printf("palindrome\n"); } else { printf("not palindrome\n"); } return 0; }
核心修改说明
- 新增临时变量
popped_char存储pop()的结果,确保每个栈元素只被弹出一次,避免指针异常。 - 修正字符串索引为
s[n-1 - i],指向正确的回文对称位置。 - 用提前计算好的
n/2替代重复调用strlen(s)/2,提升代码效率。
内容的提问来源于stack exchange,提问作者rasberry
相关产品推荐
相关产品推荐

