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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:05:15