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");
}
posted @ 2023-07-05 21:36  星光樱梦  阅读(18)  评论(0编辑  收藏  举报