两栈共享空间

本文以两个大学室友在北京合租为例,形象地解释了两栈共享空间的概念。当两个栈的需求相反,如一个栈增长时另一个栈缩小,这种结构能有效提高空间利用率并降低成本。该方法常用于数据结构中,尤其是在处理类似股票交易的场景,避免栈溢出。但需要注意,如果栈中数据类型不同,共享空间可能会使问题复杂化。
摘要由CSDN通过智能技术生成

大话数据结构:打个比方,两个大学室友毕业同时到北京工作,开始时,他们觉得住了这么多年的集体宿舍,现在工作了一定要有自己的私密空间。于是他们都希望租房时能租到独住的一居室,可找来找去才发现,最便宜的一居室要1500,地段还不好,实在是承受不起,最终他们两还是合租了一套两居室,一共2000各出一半还不错。
对于两个一居室都有独立的卫生室和厨房,是私密了,但大部分空间的利用率却不高。而两居室,两个人各有卧室,还共享了客厅,厨房,卫生间,房间的利用率就显著提高,而且租房的成本也大大下降。

/*
使用前提:相同数据类型的两个栈,最好一方减少,另外一方随之增加
*/

const   int  MAXSIZE = 20;

template <typename  T>
class  Sharestack
{
public:
    Sharestack()
    {
        data = new  T[MAXSIZE]();
        top0 = -1;
        top1 = MAXSIZE;
    }
    Sharestack(const  Sharestack & rhs)
    {
        data = new  T[MAXSIZE]();
        top0 = rhs -> top0;
        top1 = rhs -> top1;
        memcpy(data,rhs->data,sizeof(T)*MAXSIZE);
    }
    ~Sharestack()
    {
        delete [] data;
        data = NULL;
    }

    bool Empty(bool stackNumber)
    {
        if(!stackNumber)
        {
            if(top0 == -1)
            {
                return 1;
            }
        }

        if(stackNumber == 1)
        {
            if(top == MAXSIZE)
            {
                return 1;
            }
        }
        return 0;
    }

    bool Full()
    {
        return top0 + 1 == top1;
    }

    void Push(T val,bool stackNumber)
    {
        if(Full())
        {
            throw  std::exception("Stack  is  Full !");
        }
        if(!stackNumber)
        {
            data[++top0] = val;
        }
         if(stackNumber)
        {
            data[--top1] = val;
        }
    }

    void Pop(bool stackNumber)
    {
        if(Empty(stackNumber))
        {
            throw  std::exception("Stack  is Empty!");
        }
        if(!stackNumber)
        {
            --top0;
        }
        if(stackNumber)
        {
            ++top1;
        }
    }

    T  top(bool stackNumber)
    {
        if(Empty(stackNumber))
        {
             throw  std::exception("Stack  is Empty!");
        }
        if(!stackNumber)
        {
            data[top0];
        }
        if(stackNumber)
        {
            data[top1];
        }
    }
    
    int Size (bool stackNumber)
    {
        if(!stackNumber)
        {
           return top0+1;
        }
        if(stackNumber)
        {
            return MAXSIZE - top1;
        }
    }

    void Clear(bool stackNumber)
    {
        if(!stackNumber)
        {
            top0 == -1;
        }
        if(stackNumber)
        {
            top1 == MAXSIZE;
        }
    }
    void  Show(bool stackNumber)
    {
        if(!stackNumber)
        {
             std::cout<<"stack-0:  ";
            for(int i = 0;i <= top0;++i)
            {
                std::cout<<data[i]<<"-";
            }
            std::cout<<std::endl;
        }
        if(stackNumber)
        {
            std::cout<<"stack-1:  ";
            for(int i = MAXSIZE-1;i >= top1;--i)
            {
                std::cout<<data[i]<<"-";
            }
            std::cout<<std::endl;
        }
    }
private:
    T *data;
    int top0;
    int top1;
};


int main()
{
    Sharestack<int> sta;
    for(int i = 0;i <= 8;i++)
    {
        sta.Push(i,0);
        sta.Push(i,1);
    }
    sta.Show(0);
    sta.Show(1);
}


事实上,使用这样的数据结构,通常都是当两个栈的空间需求有相反关系时,也就是一个栈增长时另外一个栈缩短。就像买股票,你买入时,一定是有一个你不知道的人卖出。有人赚钱,就一定有人赔钱。这样使用两栈共享的空间存储办法才有较大意义,否则两个栈都在不停的增长,那很快就会因为栈满而溢出了。
当然这只是指针两个具有相同数据类型设计上的一个技巧,如果是不相同数据类型的栈,这种办法不但不能很好的处理问题,反而会使问题变得更复杂,大家要注意这个问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值