栈的顺序存储结构只准栈顶输入元素,因此不存在线性表的插入建和删除时需要移动元素的问题。但是这样会导致内存不够用的问题,顺序栈必须事先确定数组存储空间大小,如果存储空间满了,就需要程序员进行编程操作扩展数组的容量。
这也太麻烦了,一个不行,我用两个!找两个相同类型的栈,同时在两个栈里各自开辟数组空间,漂亮!但是没想到:第一个已经满了,再存储元素的话就会溢出,另一个栈存储空间还很多。这不是浪费吗?
我们可以反过来想:用一个数组存储两个栈。这样不就解决了嘛。
数组有两个端点,两个栈就有两个栈顶,我们可以让一个栈的栈底作为数组的始端,即A[0],另一个栈的栈底作为数组的末端,即A[n-1]。如果我们想增加元素的话,这两个端点就会向中间延伸。
程序例子:
typedef struct
{
SElemType data[MAXSIZE];
int top1; //栈1的栈顶指针
int top2; //栈2的栈底指针
}SqDoubleStack;
Status Push (SqDoubleStack *S, SElemType e, int stackNumber)
{
if (S->top1 + 1 == S->top2) //栈满,不能增加新元素
return ERROR;
if (stackNumber == 1