一个数组实现两个栈(共享栈)(扩容)

  一个数组实现两个栈的具体方法:一个数组实现两个栈(共享栈)但是上述方法的缺陷是数组的大小是恒定的,当数组满的时候就无法进行入栈操作。这篇博客我们将讲一下数组如何扩容?


  实现方法:一个数组实现两个栈=====>>下标为0的位置为栈1的栈底,栈2的栈底在下标最大的位置上。栈1向左扩展,栈2向后扩展。若数组已满则增容。
这里写图片描述
  首先定义一个共享栈的结构体:

#define DataType int 
typedef struct SharedStack
{
    DataType *data;
    int capacity;//容量   
    int top1;
    int top2;   
}sharedstack;

共享栈的初始化

//共享栈初始化
void InitShared(sharedstack *s)
{
    assert(s);
    s->capacity = 5;
    s->top1 = 0;
    s->top2 = s->capacity - 1;
    s->data = (DataType *)malloc(s->capacity*sizeof(DataType));
}

入栈:
  入栈之前先扩容

void ExpandCapacity(sharedstack *s)
{
    DataType *Newnode = NULL;
    int newcapacity = 0;
    int i = 0;
    if (s->top1 <= s->top2)
    {
        //不用扩容,直接返回
        return ;
    }
    newcapacity = s->capacity * 2;
    Newnode = (DataType*)malloc(newcapacity*sizeof(DataType));
    if (Newnode == NULL)
    {
        printf("新空间开辟失败!\n");
        return ;
    }
    //搬移元素
    for (i = 0; i < s->top1; i++)
    {
        Newnode[i] = s->data[i];
    }

    for (i = s->capacity - 1; i>s->top2; i--)
    {
        Newnode[i+s->capacity]=s->data[i];
    }
    s->top2 = s->top2 + s->capacity;
    s->capacity = newcapacity;

    //释放之前的空间
    free(s->data);
    s->data = Newnode;
}
//入栈
void PushSharedStack(sharedstack *s, DataType d, int which)
{
    assert(s);
    ExpandCapacity(s);
    
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值