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

为何要将栈顶初始化为-1?双栈场景下top1指向何处?

关于双栈实现中栈顶初始化的问题解答

先把你给出的代码贴出来,方便咱们对照分析:

#define SIZE 100 // 补充SIZE定义,原代码需此值才能正常运行
int ar[SIZE];
int top1 = -1;
int top2 = SIZE;
void push_stack1 (int data) {
    if (top1 < top2 - 1) {
        ar[++top1] = data;
    } else {
        printf ("Stack Full! Cannot Push\n");
    }
}

咱们一个个拆解你的问题:

1. 为何我们要将栈顶初始化为-1?

这是数组实现栈时空栈的标准约定,道理很直白:数组的合法索引是从0开始的,当栈里没有任何元素时,栈顶自然要指向一个「不存在的位置」,-1正好落在数组索引范围(0到SIZE-1)之外,完美标识空栈状态。

你看push_stack1的逻辑:先执行++top1再赋值。第一次push时,top1从-1变成0,正好对应数组的第一个位置ar[0],完全贴合数组的索引规则。要是一开始把top1设为0,我们会误以为栈里已经有元素,但实际是空的,后续判断栈满、栈空的逻辑全都会乱套。

2. 为何必须将其中一个栈初始化为-1?top1会指向哪里?

这得结合你这个双栈共享数组的实现思路来看:

  • 这个方案是让两个栈从数组两端向中间“挤压”存放:stack1从数组开头(索引0)往中间生长,stack2从数组末尾(索引SIZE-1)往中间生长。
  • 所以stack1用top1 = -1标识空栈,stack2用top2 = SIZE标识空栈(数组最后一个合法索引是SIZE-1,SIZE同样是超出范围的空栈标识)。这样两个栈的空间互不干扰,直到top1 >= top2 -1时,数组才被完全占满。

至于top1的指向:

  • 当stack1为空时,top1是-1;
  • 每push一个元素,top1就递增1,当stack1非空时,top1直接指向栈顶元素所在的数组索引。比如push第一个元素后,top1=0,指向ar[0];push第二个后top1=1,指向ar[1],以此类推。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:36:48