首页 > 代码库 > 函数的封装

函数的封装

  第一次写这种风格的代码,就用了上一篇的代码来做的测试,一次成功(毕竟连看都没看过具体实现过程,就在cpp上看到过几句ifndef、endif,还是挺开心的),效果不错,但稍微感觉隐藏函数的实现的细节等,貌似运行慢了点,毕竟强行include了过来,不知道是不是错觉。

  具体过程如下(我用的是VC++ 6.0):

在写好的代码工作室中添加头文件,名字就按自己的代码主要实现的是什么功能来命名比较好,比如 STACK.H,一看就知道是关于栈的,然后就没然后了。具体就看头文件的内容吧:

#ifndef _STACK_H
#define _STACK_H

#define MaxSize 50                //栈的最大空间
#define EmptyToStack -1            //空栈判断

typedef int ElemType;
typedef int Status;                //状态函数

typedef struct Stack
{
    int base;        //栈底
    int top;        //栈顶
    ElemType * Array;
}Stack;

/* 定义所有函数 */
Stack * CreateStack();
void DestroyStack();
void MakeEmpty();
int    IsEmpty();
int IsFull();
int StackLen();
Status Push();
ElemType Pop();
ElemType Top();

#endif

  然后,再在工作室中添加一个xxx.c的文件,这个文件的作用就是用来写具体函数功能的实现细节的,也就是说把所有函数全部封装到这个文件中,然后记得#include "stack.h"

  以我写的顺序栈的实现的代码为例:

/* stack.c */
#include<stdio.h>
#include<stdlib.h>
#include"stack.h"

/* 状态参数 */
#define OK 1
#define ERROR 0

Stack * CreateStack(int MaxStackSize)        //创建栈
{
    Stack * s;

    s = (Stack *)malloc(sizeof(Stack));
    s -> Array = malloc(sizeof(ElemType) * MaxStackSize);
    if(!(s -> Array || s))
        puts("ERROR!");
    s -> base = MaxStackSize;
    
    MakeEmpty(s);

    return s;
}

void DestroyStack(Stack * p)        //栈的释放
{
    if(p != NULL)
    {
        free(p -> Array);
        free(p);
    }
}

void MakeEmpty(Stack * p)            //空栈
{
    p -> top = EmptyToStack;
}

int    IsEmpty(Stack * p)                //检测一个栈是否为空
{
    return (p -> top == EmptyToStack);
}

int IsFull(Stack * p)                //检测栈是否满
{
    return (p -> top == MaxSize - 1);
}

Status Push(Stack * p, ElemType X)    //压栈
{
    if( IsFull(p) )
    {
        puts("FULL!");
        return ERROR;
    }
    else
        p -> Array [++ p -> top] = X;
    return OK;
}

int StackLen(Stack * p)                //栈的长度
{
    return p -> top + 1;
}

ElemType Pop(Stack * p)                //弹栈
{
    if( IsEmpty(p) )
    {
        puts("NULL!");
        return ERROR;
    }
    else
        return p -> Array [p -> top --];
}

ElemType Top(Stack * p)            //获取栈顶元素
{
    if( !IsEmpty(p) )
        return p -> Array [p -> top];
    else
        return 0;
}

  这样就差不多了,当然主要的调用接口的文件里也需要添加#include "stack,h" ,且原先里面的所有函数是全部剪切到stack.c文件的,自然就不用重复出现这些函数的实现代码了,原先里面的所有函数的定义是剪切到stakc.h中的,也不用再重复定义了,然后点击编译链接的时候三个会一起编译链接。

函数的封装