栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言实现可伸缩的栈结构

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言实现可伸缩的栈结构

// stack.h

#ifndef _STACK_H_
#define _STACK_H_

#ifdef __cplusplus
extern "C" {
#endif



// 接口声明
typedef struct stack stack_t;
void stack_push(stack_t **pstk, void *value);
void* stack_pop(stack_t **pstk);
void* stack_top(stack_t **pstk);

// 调用者自行实现销毁栈的函数, 或调用如下函数销毁栈
static inline void
stack_destroy(stack_t **pstk, void (*destroy_element)(void*))
{
    void *value;
    while (!!(value = stack_pop(pstk)))
        if (destroy_element)
            destroy_element(value);
}

#ifdef __cplusplus
} // extern "C"
#endif

#endif // _STACK_H_

// stack.c

#include "stack.h"

// stack结构无需对用户暴露
struct stack {
    int top;
    int cnt;
    struct stack *next;
    void *value[1];
};

static inline int
stack_empty(stack_t *stk)
{
    return (stk->top == -1);
}

static inline int
stack_full(stack_t *stk)
{
    return (stk->top + 1 == stk->cnt);
}

#define DEFAULT_STACK_CNT 128

static inline void
stack_expand(stack_t **pstk)
{
    // 这里假定内存分配不会失败,可以实现这样的函数,例如kmem_alloc(size, KM_SLEEP), 分配不到内存则睡眠等待
    stack_t *stk = malloc(sizeof(stack_t)
        + sizeof(void*) * (DEFAULT_STACK_CNT - 1));
    stk->next = *pstk;
    stk->top = -1;
    stk->cnt = DEFAULT_STACK_CNT;
    
    *pstk = stk;
}

static inline void
stack_reduce(stack_t **pstk)
{
    stack_t *stk = *pstk;
    while (stk && stack_empty(stk)) {
        stack_t *next = stk->next;
        free(stk);
        stk = next;
    }
    *pstk = stk;
}

void
stack_push(stack_t **pstk, void *value)
{
    if (!*pstk || stack_full(*pstk))
        stack_expand(pstk);
    
    stack_t *stk = *pstk;
    stk->value[++stk->top] = value;
}

void*
stack_pop(stack_t **pstk)
{
    if (!*pstk)
        return (NULL);
    
    
    stack_t *stk = *pstk;
    void *value = stk->value[stk->top--];
    stack_reduce(pstk);
    
    return (value);
}

void*
stack_top(stack_t **pstk)
{
    stack_t *stk = *pstk;
    return (stk ? stk->value[stk->top] : NULL);
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/870133.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号