为何要将栈顶初始化为-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
相关产品推荐
相关产品推荐

