一道面试题:一个数组实现两个栈
通常我们实现栈有 数组 和 链式 两种结构。 但数组形式一般用来实现一个栈, 现在我们如何用一个数组 来实现 两个栈保存数据呢。
一般来说,有三种思路:
1. 将数组的下标为0的位置当做第一个栈的栈底,下标为1的位置当做第二个栈的栈底,将数组的偶数位置看做第一个栈的存储空间,奇数位置看做第二个栈的存储空间。 如图:
2.从数组中间分别向两边压栈将数组的中间位置看做两个栈的栈底,压栈时栈顶指针分别向两边移动,当任何一边到达数组的起始位置或是数组尾部,则开始扩容。 如图
3. 从两边向中间压栈将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。
方案一二都会存在空间浪费的问题,分析如下图: