11. 共享栈
一、什么是共享栈
两个栈共享同一片存储空间,这片存储空间不单独属于任何一个栈,某个栈需要的多一点,它就可能得到更多的存储空间。两个栈的栈底在这片存储空间的两端,当元素入栈时,两个栈的栈顶指针相向而行。
#define MAX_SIZE 10
typedef int ElementType;
typedef struct SNode
{
int Data[MAX_SIZE];
int Top1;
int Top2;
}SNode, * Stack;
二、创建空的栈
/**
* @brief 生成一个栈
*
* @return Stack 生成的栈
*/
Stack CreateStack(void)
{
Stack PtrS = (Stack)malloc(sizeof(SNode));
PtrS->Top1 = -1;
PtrS->Top2 = MAX_SIZE;
return PtrS;
}
三、判断栈是否为空
两个栈分别从数组的两头开始向中间生长,当两个栈的栈顶指针相遇时,表示两个栈都满了。
/**
* @brief 判断栈是否为空
*
* @param PtrS 栈
* @param Tag 0: 第一个栈; 1: 第二个栈
* @return int 0: 栈非空; 1: 栈已空;
*/
int IsEmpty(Stack PtrS, int Tag)
{
if (Tag == 0)
{
return PtrS->Top1 == -1;
}
else if (Tag == 1)
{
return PtrS->Top2 == MAX_SIZE;
}
}
四、压栈
/**
* @brief 压栈
*
* @param PtrS 栈
* @param Item 值
* @param Tag 0: 第一个栈; 1: 第二个栈
*/
void Push(Stack PtrS, ElementType Item, int Tag)
{
if (PtrS->Top2 - PtrS->Top1 == 1)
{
printf("栈已满!\n");
return;
}
if (Tag == 0)
{
PtrS->Data[++PtrS->Top1] = Item; // 对第一个栈操作
}
else if (Tag == 1)
{
PtrS->Data[--PtrS->Top2] = Item; // 对第二个栈操作
}
}
五、出栈
/**
* @brief 出栈
*
* @param PtrS 栈
* @param Tag 0: 第一个栈; 1: 第二个栈
* @return ElementType 出栈的元素
*/
ElementType Pop(Stack PtrS, int Tag)
{
if (Tag == 0)
{
if (PtrS->Top1 == -1)
{
printf("栈1已空\n");
return NULL;
}
return PtrS->Data[PtrS->Top1--];
}
else if (Tag == 1)
{
if (PtrS->Top2 == MAX_SIZE)
{
printf("栈2已空!\n");
return NULL;
}
return PtrS->Data[PtrS->Top2++];
}
}
六、获取栈顶元素
/**
* @brief 获取栈顶元素
*
* @param PtrS 栈
* @param Tag 0: 第一个栈; 1: 第二个栈
* @return ElementType 栈顶的元素
*/
ElementType Peek(Stack PtrS, int Tag)
{
if (Tag == 0)
{
if (PtrS->Top1 == -1)
{
printf("栈1已空\n");
return NULL;
}
return PtrS->Data[PtrS->Top1];
}
else if (Tag == 1)
{
if (PtrS->Top2 == MAX_SIZE)
{
printf("栈2已空!\n");
return NULL;
}
return PtrS->Data[PtrS->Top2];
}
}
七、遍历栈
/**
* @brief 遍历栈
*
* @param PtrS 栈
*/
void PrintSharedStack(Stack PtrS)
{
printf("栈1:");
for (int i = PtrS->Top1; i >= 0; i--)
{
printf("%d ", PtrS->Data[i]);
}
printf("\n");
printf("栈2:");
for (int i = PtrS->Top2; i < MAX_SIZE; i++)
{
printf("%d ", PtrS->Data[i]);
}
printf("\n");
}