题干
请用一个数组实现两个堆栈,要求最大可能地利用数组空间,使数组只要有空间、入栈操作就能成功。写出相应的入栈和出栈操作函数。
分析
- 第一种方案,是将数组空间一分为二地分配给两个堆栈使用,一个堆栈的底在数组的起始位置,另一个在数组的中间位置,两个栈顶指针Top都沿着同一个方向增长。若其中一个堆栈先满了,而另一个堆栈还有空,我们可以顺序移动数据,为满的那个堆栈腾出空位来。但是这种方法,可能涉及很多数据的移位,比较麻烦。
- 第二种方案,是使两个栈分别从数组的两头开始、向中间生长,当两个栈顶指针相遇时,代表两个栈都满了。
代码
- 双堆栈结构的声明:
typedef int Position;
typedef struct SNode *PtrToSNode;
struct SNode {
ElementType *Data;/*存储元素的数组*/
Position Top1;/*堆栈1的栈顶指针*/
Position Top2;/*堆栈2的栈顶指针*/
int MaxSize;/*2个堆栈的最大容量*/
}