数据结构零基础入门(初学者也能看懂):一个数组实现两个栈

用一个数组实现两个栈,在某些场景下可以节省内存。

【思路】

栈一在数组头部开始入栈并更新top,栈二在数组尾部入栈并更新rear(初始值为数组最尾index)。

top和rear接头的时候,两栈全满。

【代码实现】

#ifndef __STACK_DOUBLE__H__
#define __STACK_DOUBLE__H__

#define DSTACK_ISEMPTY_FRONT(st) (st->top == -1)
#define DSTACK_ISEMPTY_REAR(st)  (st->rear == st->capability)
#define DSTACK_ISFULL(st)  (st->top == (st->rear-1))

// front push
static inline void fpush(stack_t *st, int data)
{
    //if NULL

    if (DSTACK_ISFULL(st)) assert(0); // in fact, don't be assert

    st->arr[++st->top] = data;
}

// rear push
static inline void rpush(stack_t *st, int data)
{
    //if NULL

    if (DSTACK_ISFULL(st)) assert(0); // in fact, don't be assert

    st->arr[--st->rear] = data;
}

// front pop
static inline int fpop(stack_t *st)
{
    //if NULL

    if (!DSTACK_ISEMPTY_FRONT(st)) {
        return st->arr[(st->top--)];
    }
}

// rear pop
static inline int rpop(stack_t *st)
{
    //if NULL

    if (!DSTACK_ISEMPTY_REAR(st)) {
        return st->arr[st->rear++];
    }
}

// front top
static inline int ftop(stack_t *st)
{
    //if NULL

    if (!DSTACK_ISEMPTY_FRONT(st)) {
        return st->arr[(st->top)];
    }
}

// rear top
static inline int rtop(stack_t *st)
{
    //if NULL

    if (!DSTACK_ISEMPTY_FRONT(st)) {
        return st->arr[st->rear];
    }
}
#endif

【测试用例】

int  dtest_stack_arr()
{
    stack_t *st = stack_create(TEST_ELEM_MAX_LEN);
    //if !st

    int i = 0;

    // 向第一个栈压入部分数据。
    for (i=0; i<TEST_ELEM_MAX_LEN/2; i++) {
        fpush(st, i);
    }

    // 向第二个栈压入部分数据。
    for (; i<TEST_ELEM_MAX_LEN; i++) {
        rpush(st, i);
    }

    // 将两个栈分别pop。
    for (i=0; i<TEST_ELEM_MAX_LEN/2; i++) {
        //printf("top: %d\n", ftop(st));

        printf("ftop: %d\n", fpop(st));
        printf("rtop: %d\n", rpop(st));

        printf("\n");
    }

    stack_destroy(st);

    return 0;
}

int main()
{
    dtest_stack_arr();

    return 0;
}

【测试结果】

./a.out 

ftop: 4
rtop: 9

ftop: 3
rtop: 8

ftop: 2
rtop: 7

ftop: 1
rtop: 6

ftop: 0
rtop: 5

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值