这篇 还是双端链表基础上实现,这里面只是在套组件,套写过的东西,就需要重新组合一下而已,也许以后在公司也就是这个样子,感觉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多行代码写完了,栈,还是双端链表给力。