数据结构之栈(二)

栈      先进后出


定义节点结构体,包含双向链表

struct node_t 
{
    int data;
    struct list_head list;
};

申明栈:

struct stack_t
{
    struct list_head head;
    int (*is_empty)(struct stack_t *);                              //判断栈是否为空
    struct node_t *(*push)(struct stack_t *, int data);             //进栈
    int (*pop)(struct stack_t *);                                   //出栈
    int (*top)(struct stack_t *);                                   //返回栈顶元素
};
struct stack_t *stack_init();                                       //初始化栈
void stack_destory(struct stack_t *);                               //销毁栈
具体实现:

进栈:

struct node_t *stack_push(struct stack_t *stack, int data)
{
    struct node_t *node = (struct node_t *)malloc(sizeof(struct node_t));
    INIT_LIST_HEAD(&node->list);
    node->data = data;

    list_add(&node->list, &stack->head);
    return node;
}
出栈:

int stack_pop(struct stack_t *stack)
{
    struct node_t *node = container_of(stack->head.next, struct node_t, list);
    int data = node->data;
    list_del(&node->list);
    free(node);

    return data;
}
返回栈顶元素:

int  stack_top(struct stack_t *stack)
{
    struct node_t *node = container_of(stack->head.next, struct node_t, list);
    int data = node->data;

    return data;
}

初始化栈:

struct stack_t *stack_init()
{
    struct stack_t *stack = (struct stack_t *)malloc(sizeof(struct stack_t));
    INIT_LIST_HEAD(&stack->head);

    stack->is_empty = stack_is_empty;
    stack->push = stack_push;
    stack->pop = stack_pop;
    stack->top = stack_top;

    return stack;
}
销毁栈:

void stack_destory(struct stack_t *stack)
{
    struct node_t *node = NULL;
    struct node_t *tmp = NULL;
    list_for_each_entry_safe(node, tmp, &stack->head, list)
    {
        list_del(&node->list);
        free(node);
    }
}
















参考 数据结构(C语言版) 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值