美文网首页
两栈共享空间

两栈共享空间

作者: lxr_ | 来源:发表于2022-03-16 16:23 被阅读0次

1.如果有两个相同类型的栈,我们为它们各自开辟了数组空间,极有可能一个栈已经满了,再进栈就溢出了,而另一个栈还有很多存储空间空间
2.所以我们可以使用一个数组来存储两个栈
3.具体做法如下:数组有两个端点,两个栈有两个栈底,让一个栈的栈底为数组的始端,即下标为0处另一个栈为数组的末端,即下标为数组长度n-1处
这样,两个栈如果增加元素,就是两端点向中间延伸
与上一遍顺序栈的程序不同的是,此处采用下标记录栈顶位置,而非指针,且并没有指向栈顶的下一个存储空间
如下图所示:

两栈共享空间
下面实现两栈共享空间的操作:

SqDoubleStack.h

#pragma once
#define MAXSIZE 20
// 函数结果状态代码
#define OK      1
#define ERROR   0
#define INFEASIBLE  -1
#define OVERFLOW    -2

//Status 是函数的类型,其值是函数结果状态代码
typedef int Status;
//数据类型
typedef int SElemType;

typedef struct
{
    SElemType* data;
    int top1;
    int top2;
}SqDoubleStack;

//顺序栈初始化
Status InitSqDoubleStack(SqDoubleStack& S);

//判断顺序栈是否为空
bool StackEmpty(SqDoubleStack S);

//求顺序栈长度
int StackLength(SqDoubleStack S);

//清空顺序栈
Status ClearStack(SqDoubleStack& S);

//销毁顺序栈
Status DestroyStack(SqDoubleStack& S);

//顺序栈入栈
Status Push(SqDoubleStack& S, SElemType e, int stackNumber);

//顺序栈出栈
Status Pop(SqDoubleStack& S, SElemType& e, int stackNumber);

//遍历顺序栈
void StackTraverse(SqDoubleStack S);

SqDoubleStack.cpp

#include <iostream>
#include "SqDoubleStack.h"

using namespace std;

//顺序栈初始化
Status InitSqDoubleStack(SqDoubleStack& S)
{
    S.data = new SElemType[MAXSIZE];    //申请内存
    if (!S.data)                        //申请失败
    {
        cout << "初始化失败" << endl;
        exit(OVERFLOW);
    }
    S.top1 = -1;
    S.top2 = MAXSIZE;
    return OK;
}

//清空顺序栈
Status ClearStack(SqDoubleStack& S)
{
    S.top1 = -1;
    S.top2 = MAXSIZE;
    return OK;
}

//销毁顺序栈
Status DestroyStack(SqDoubleStack& S)
{
    if (S.data)             //如果栈存在
    {
        delete S.data;

        S.data = NULL;
    }
    return OK;
}

//判断顺序栈是否为空
bool StackEmpty(SqDoubleStack S)
{
    if (S.top1 == -1 && S.top2 == MAXSIZE)
    {
        return true;
    }
    return false;
}

//求顺序栈长度
int StackLength(SqDoubleStack S)
{
    return (S.top1 + 1) + (MAXSIZE - S.top2);
}

//顺序栈入栈
Status Push(SqDoubleStack& S, SElemType e, int stackNumber)
{
    if (S.top1 + 1 == S.top2)   //先判断是否栈满
    {
        cout << "栈满,入栈失败" << endl;
        return ERROR;
    }
    if (stackNumber == 1)       //如果要入栈1
    {
        S.top1++;               //下标移动
        S.data[S.top1] = e;
        return OK;
    }
    else if (stackNumber == 2)  //如果要入栈1
    {
        S.top2--;               //下表移动
        S.data[S.top2] = e;
        return OK;
    }
    else
    {
        cout << "输入有误,请输入1或2" << endl;
        return ERROR;
    }
}

//顺序栈出栈
Status Pop(SqDoubleStack& S, SElemType& e, int stackNumber)
{
    if (stackNumber == 1)           //如果要出栈1
    {
        if (S.top1 == -1)           //判断栈1是否为空
        {
            cout << "栈1为空" << endl;
            return ERROR;
        }
        e = S.data[S.top1];
        S.top1--;
        return OK;
    }
    else if (stackNumber == 2)
    {
        if (S.top2 == MAXSIZE)
        {
            cout << "栈2为空" << endl;
            return ERROR;
        }
        e = S.data[S.top2];
        S.top2++;
        return OK;
    }
    else
    {
        cout << "输入有误,请输入1或2" << endl;
        return ERROR;
    }

    return OK;
}

//遍历顺序栈
void StackTraverse(SqDoubleStack S)
{
    int p1 = S.top1, p2 = S.top2;

    //遍历栈1
    while (p1 >= 0)
    {
        cout << S.data[p1] << " ";
        p1--;
    }
    cout << endl;

    //遍历栈2
    while (p2 < MAXSIZE)
    {
        cout << S.data[p2] << " ";
        p2++;
    }
    cout << endl;
}

main.cpp

测试:

#include <iostream>
#include "SqDoubleStack.h"
using namespace std;

int main(int argc, char** argv)
{
    SqDoubleStack S;
    InitSqDoubleStack(S);   //初始化栈

    Push(S, 1, 1);          //入栈
    Push(S, 2, 1);
    Push(S, 3, 1);

    Push(S, 1, 2);
    Push(S, 2, 2);
    Push(S, 3, 2);

    StackTraverse(S);       //遍历

    cout << "栈长度:" << StackLength(S) << endl;

    SElemType e;

    Pop(S, e, 1);           //出栈
    cout << "栈1弹出:" << e << endl;
    Pop(S, e, 2);
    cout << "栈2弹出:" << e << endl;
    Pop(S, e, 1);
    Pop(S, e, 1);
    Pop(S, e, 2);
    Pop(S, e, 2);           //元素全部弹出

    if (StackEmpty(S))      //判断栈空
    {
        cout << "栈空" << endl;
    }

    Pop(S, e, 1);           //栈已为空
    Pop(S, e, 2);

    return 0;
}

相关文章

  • 大话数据结构—两栈共享空间(五)

    1.两栈共享空间

  • 两栈共享空间

    参考书籍:《大话数据结构》环境:VS2017

  • 两栈共享空间

    1.如果有两个相同类型的栈,我们为它们各自开辟了数组空间,极有可能一个栈已经满了,再进栈就溢出了,而另一个栈还有很...

  • 共享栈

    利用栈底为止相对不变的特性,可让两个顺序栈共享一个一维数组空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向...

  • [libco] 协程栈空间

    协程“栈”空间,有独立栈和共享栈,重点理解一下协程共享栈。 文章来源:[libco] 协程栈空间[https://...

  • 栈的扩展

    共享栈 两个栈 共享一片存储空间 栈s1 需要存6个 而栈s2 只需要存1个 栈s2 有多余的存储空间 但是它不需...

  • 栈(两栈共享空间结构)

    栈:限定只能在表尾进行插入和删除的线性表。 两栈共享空间结构:使用数组同时实现两个栈,即栈1和栈2;栈1为空时,栈...

  • 数据结构的各种代码

    第 02 章 线性表 顺序存储结构 链式存储结构 第 03 章 栈与队列 顺序栈 链栈 两栈共享空间 循环队列 链...

  • 实验四——共享栈和小火车

    1.1、共享栈的设置,问题描述如下:在一维数组空间stack[MaxSize]中可以同时存放两个顺序栈,栈底分别处...

  • 005 go语言 两栈(双栈) 共享空间

    1 双栈共享空间 思路 如果有两个类型相同的栈,我们为它们分别开辟了数组空间。极有可能是一个栈已经满了,再入栈就溢...

网友评论

      本文标题:两栈共享空间

      本文链接:https://www.haomeiwen.com/subject/rlmpdrtx.html