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

栈Push函数异常:top初始为-1时数组下标赋值导致值错误

栈Push函数异常的问题分析与修复方案

嘿,我一眼就揪出你这个问题的核心了——数组越界访问引发的未定义行为,再加上push逻辑的顺序错误,才搞出了这种不符合预期的输出。让我给你拆解清楚:

为什么会出现top变成12的诡异情况?

  1. 你初始化栈时把top设为-1,这是栈为空的标准写法(表示当前栈里没有元素,下一个元素要放在top+1的位置)。
  2. 但你写的arr[top++]=item用了后置自增运算符,它的执行顺序是:
    • 先拿当前top的值(-1)当数组下标,访问arr[-1]——这已经是数组越界了,因为数组下标从0开始,arr[-1]指向的是数组内存块前面的区域。
    • 然后把top自增为0。
    • 最后把item(也就是12)赋值给arr[-1]对应的内存地址。
  3. 而根据C++类的成员内存布局,你的stack类里top是第一个成员变量,arr是第二个,所以arr[-1]刚好对应top变量的存储地址!这就等于你把12直接覆盖了top的值,所以打印的时候top就变成12了,完全打乱了栈的逻辑。

正确的Push函数写法

栈的push逻辑应该是:先让top指向新的空闲位置,再把元素放进去。有两种靠谱的写法:

写法一:先手动自增top,再赋值

void stack::push(int item) {
    top++; // 先让top移动到新的空闲位置
    arr[top] = item;
    cout << "\n" << item << " pushed in stack";
    cout << "\n top value is " << top;
}

写法二:使用前置自增运算符

void stack::push(int item) {
    arr[++top] = item; // 前置自增:先把top加1,再用新的top作为下标
    cout << "\n" << item << " pushed in stack";
    cout << "\n top value is " << top;
}

修复后的输出验证

用修正后的代码运行三次push操作,输出会完全符合你的预期:

12 pushed in stack
 top value is 0
19 pushed in stack
 top value is 1
31 pushed in stack
 top value is 2

额外建议:加上满栈判断

为了避免后续出现数组越界的问题,建议给push函数加上栈满的判断:

void stack::push(int item) {
    if (top >= 499) { // arr的大小是500,最大下标是499
        cout << "\n Stack Overflow!";
        return;
    }
    arr[++top] = item;
    cout << "\n" << item << " pushed in stack";
    cout << "\n top value is " << top;
}

内容的提问来源于stack exchange,提问作者Naman Kumar Narula

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:27:20