用双端链表实现通用栈

      这篇 还是双端链表基础上实现,这里面只是在套组件,套写过的东西,就需要重新组合一下而已,也许以后在公司也就是这个样子,感觉C语言越来越强大了,还需要好好搞搞C语言,关于栈,不想多BB,感觉说啥概念没意思了,也就是上代码,这是如何实现的

  stack.h文件

#ifndef _STACK_H_
#define _STACK_H_

#include "dlist.h"
#include "tools.h"

//栈的控制信息
typedef struct Stack
{
    Dlist *dlist;   //用双端链表的控制信息直接封装栈
}Stack;

//关于栈的接口
Stack *init_stack(void);    //栈的初始化
void destroy_stack(Stack **stack);    //栈的销毁
void push(Stack *stack, void *value);    //入栈
Boolean pop(Stack *stack);    //出栈
Boolean get_top(Stack *stack, void **value);   //得到栈顶元素
Boolean is_stack_empty(Stack *stack);    //判断栈是否为空
int get_stack_count(Stack *stack);    //得到栈的元素个数

#endif

  stack.c文件


#include "stack.h"


//关于栈的接口
Stack *init_stack(void)    //栈的初始化
{
    Stack *stack = (Stack *)Malloc(sizeof(Stack));
    stack->dlist = init_dlist();

    return stack;
}

void destroy_stack(Stack **stack)    //栈的销毁
{
    if(stack == NULL || *stack == NULL){
        return ;
    }
    
    //先释放栈控制信息中双端链表,在释放栈的控制信息
    destroy_dlist( &((*stack)->dlist) );
    free(*stack);
    *stack = NULL;
}

void push(Stack *stack, void *value)    //入栈
{
    if(stack == NULL || value == NULL){
        return ;
    }
    push_front(stack->dlist, value);
}

Boolean pop(Stack *stack)    //出栈
{
    if(stack == NULL || is_stack_empty(stack)){
        return FALSE;
    }
    return pop_front(stack->dlist);
}

Boolean get_top(Stack *stack, void **value)   //得到栈顶元素
{
    if(stack == NULL || is_stack_empty(stack)){
        return FALSE;
    }
    if(value != NULL){
        get_front(stack->dlist, value);
    }
    return TRUE;
}

Boolean is_stack_empty(Stack *stack)    //判断栈是否为空
{
    return get_stack_count(stack) == ZERO; 
}

int get_stack_count(Stack *stack)    //得到栈的元素个数
{
    if(stack == NULL){
        return -1;
    }
    return get_dlist_count(stack->dlist);
}

60多行代码写完了,栈,还是双端链表给力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值