C语言栈的实现

来源:互联网 发布:opencv 图像加减源码 编辑:程序博客网 时间:2024/05/01 20:05

    作者:朱克锋

    在计算机领域,堆栈是一个不容忽视的概念,但是很多人甚至是计算机专业的人也没有明确堆栈其实是两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。要点:堆:顺序随意栈:后进先出(Last-In/First-Out)
在这里不仅仅是实现了栈,我想通过这个栈体现组合意义
首先看一下前面我写的链表,看一下代码的实现,然后再来看这个栈的实现,会发现组合的威力是多么的巨大

和前面一样先定义结构:
typedef struct _Stack
{
    DList *dlist;
}Stack;

下面定义基本操作,包括:
Stack *stack_create();
Ret stack_push(Stack *stack, void *data);
Ret stack_pop(Stack *stack);
int stack_len(Stack *stack);
void *stack_foreach(Stack *stack, VISIT_FUNC visit_func, void *ctx);
Ret stack_destroy(Stack *stack, DES_FUNC des_func, int index);

完整头文件如下
#ifndef STACK_H
#define STACK_H
/*
* File:   queue.h
*/


#include "dlist.h"

typedef struct _Stack
{
    DList *dlist;
}Stack;

Stack *stack_create();
Ret stack_push(Stack *stack, void *data);
Ret stack_pop(Stack *stack);
int stack_len(Stack *stack);
void *stack_foreach(Stack *stack, VISIT_FUNC visit_func, void *ctx);
Ret stack_destroy(Stack *stack, DES_FUNC des_func, int index);

#endif /*STACK_H*/

以下是函数实现部分(stack.c):

#include "stack.h"
#include <malloc.h>
/*
* File:   stack.c
*/
/*
*功能:实现一个结构体的初始化
*参数:void
*返回:结构体
*/


Stack *stack_create()
{
    Stack *stack = (Stack*)malloc(sizeof(Stack));

    if(stack !=NULL)
    {
        stack->dlist = dlist_create();
        if(stack->dlist == NULL)
        {
            free(stack);
            stack = NULL;
        }
    }

    return stack;
}

Ret stack_push(Stack *stack, void *data)
{
    return_val_if_fail(stack != NULL&&data != NULL, RET_FAULT);

     return dlist_add(stack->dlist, 0, data);
}

Ret stack_pop(Stack *stack)
{
    return_val_if_fail(stack != NULL, RET_FAULT);

    return dlist_delete(stack->dlist, 1);
}

int stack_len(Stack *stack)
{
    return_val_if_fail(stack != NULL, RET_FAULT);
   
    return dlist_len(stack->dlist);
}

void *stack_foreach(Stack *stack, VISIT_FUNC visit_func, void *ctx)
{
    return_val_if_fail(stack != NULL&&visit_func != NULL, NULL);
   
    return dlist_foreach(stack->dlist, visit_func, ctx);
}

Ret stack_destroy(Stack *stack, DES_FUNC des_func, int index)
{
    if(stack != NULL)
    {
        dlist_destroy(stack->dlist, des_func, index);
        stack->dlist = NULL;

        free(stack);
    }

    return RET_OK;
}



最后把测试也写在下面,供学习者测试(stacktest.c)


#include <assert.h>
#include <stdio.h>
#include "stack.h"
/*
* File:   stacktest.c
* /

/*

#include <assert.h>
#include <stdio.h>
#include "stack.h"

int main(int argc, char *argv[])
{
    int a = 33333;
    int i = 0;
    Stack * stack = NULL;

    stack =(Stack *)stack_create();

    for(i = 0; i < 10; i++)
    {
        stack_push(stack, &a);
    }
    stack_pop(stack);
    assert(9 == stack_len(stack));

    void *print_int(void *ctx, void *data)
    {
        printf("%d/n",*(int *)data);
       
        return NULL;
    }
    stack_foreach(stack, print_int, NULL );

    stack_destroy(stack, NULL, 0);
}

在这篇文章里我没有对代码本身进行解释,主要向表现的是组合的思想,程序本身不是太难,(要了解我前面写的通用链表)如果没有看的话请一定要看一下《C语言通用链表的实现》

原创粉丝点击