共享栈

定义:

利用栈底位置相对不变的特性,可以让两个顺序栈共享一个一维数组的空间,栈底位于一维数组的两端,栈顶向共享空间的中间延伸

优势:

共享栈最大的优势是节省空间,避免出现“一栈满,一栈几乎未用”的情况出现

备注,当然,省空间可以用单链表模拟更舒服啦,因为是只在一端操作,所以不用担心存取复杂度的问题啦O(∩_∩)O

操作:

设置两个栈顶指针,top0 以及 top1 分别代表两个栈顶,初始值 top0 = 0,top1 = MaxSize ,随着数据的插入,top0 递增,top1 递减,出栈正好相反。当两个指针相差为1( top1 - top0 = 1 )时说明栈满

存取时间复杂度为 O(1)

下面给出两个栈s1,s2的共享栈方式

定义:

#define MaxSize 1000
typedef struct
{
    int  _stack[MaxSize];
    int top[2];
}stk;

初始化:

void Init_Stack(stk &s)
{
    s.top[0]=-1;
    s.top[1]=MaxSize;
}

入栈操作:

bool stack_push(stk &s,int i,int a)
{
    if(i<0||i>1) return false; //i代表栈的编号,栈号不对
    if(abs(s.top[1]-s.top[0])==1) return false; //栈满报错
    if(i==0)
    {
        s._stack[++s.top[i]]=a;
    }
    else
    {
        s._stack[--s.top[i]]=a;
    }
    return true;
}

出栈操作:

bool stack_pop(stk &s,int i,int &e)
{
    if(i<0||i>1) return false; //i代表栈的编号,栈号不对
    if(i==0)
    {
        if(s.top[i]<0) return false;
        e=s._stack[s.top[i]--];
    }
    else
    {
        if(s.top[i]>MaxSize-1) return false;
        e=s._stack[s.top[i]++];
    }
    return true;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值