一个要求是要有效率的使用存储空间,也就是这个数组。用数组实现一个堆栈是经典的堆栈实现,方法就是把新数据始终放到当前所有数据的最后。这样就需要一个指向最后一个数据位置的指针,这个指针也就是栈顶指针。要想实现三个堆栈,最简单的方法就是把数组划成三个部分,每个堆栈用一个。这样堆栈1用1,4,7...,堆栈2用2,5,8...,堆栈3用3,6,9...。这样原来的实现代码几乎不用修改,只要把指针的变化从加减一变成加减三就行了。但这个方法效率不高,因为空间已经被预留了。即使某个堆栈是空的,它的空间也不能被别的堆栈使用。
怎样做到“动态”划分呢?我们可以先考虑用一个数组实现两个堆栈。我们仍然用经典的方法来实现这两个堆栈,但是区别在于,其中的一个是从数组的尾部开始反向存储数据。这样的分配是动态的,因为我们没有事先划定边界,一个堆栈最多可以用到整个数组的大小,只要它没有跟另一个堆栈重叠。要保证这一点,我们需要一个变量来记载当前堆栈长度,并在push的时候和整个数组长度,以及另一个堆栈的长度做比较来判断是否重合。基于同样的想法,我们把第三个堆栈实现在数组的中部,然后新的数据交替的插入在上半部和下半部,这样可以保证空间的占用对前两个堆栈是公平的。比如起始点是mid,push进来的数据依次放在mid,mid-1,mid+1,mid-2,mid+2。。。