本题要求在一个数组中实现两个堆栈。
如果我们希望最大程度上节省空间,那肯定是将两个堆栈,一个从头,一个从尾开始最有效率。
我将栈1视为从头开始的那个,所以栈顶的下标TOP1为-1,而TOP2为MaxSize。
所以当S->Top2 - S->Top1 == 1时,数组就满了。
然后入栈和出栈的操作与普通栈一样。
Stack CreateStack( int MaxSize )
{
Stack cache = (Stack)malloc(sizeof(struct SNode));
cache->MaxSize = MaxSize;
cache->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType));
cache->Top1 = -1;
cache->Top2 = MaxSize;
return cache;
}
bool Push( Stack S, ElementType X, int Tag )
{
if(Tag == 1)
{
if(S->Top2 - S->Top1 == 1)
{
puts("Stack Full");
return false;
}
S->Top1++;
S->Data[S->Top1] = X;
}
else
{
if(S->Top2 - S->Top1 == 1)
{
puts("Stack Full");
return false;
}
S -> Top2--;
S -> Data[S->Top2] = X;
}
return true;
}
ElementType Pop( Stack S, int Tag )
{
if(Tag == 1)
{
if(S->Top1 == -1)
{
printf("Stack %d Empty\n", Tag);
return ERROR;
}
S->Top1--;
return S->Data[S->Top1 + 1];
}
else
{
if(S->Top2 == S->MaxSize)
{
printf("Stack %d Empty\n", Tag);
return ERROR;
}
S -> Top2++;
return S->Data[S->Top2 - 1];
}
}