您的位置:首页 > 其它

用双端链表实现通用栈

2015-12-09 17:48 344 查看
这篇 还是双端链表基础上实现,这里面只是在套组件,套写过的东西,就需要重新组合一下而已,也许以后在公司也就是这个样子,感觉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多行代码写完了,栈,还是双端链表给力。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: