动态栈

/**动态栈结构定义**/
typedef struct Stack  
{
    void **base;        //栈底指针
    void **top;         //栈顶指针
    int stacksize;      //栈当前可使用的最大容量,以元素个数计
}Stack;

/**
功能:初始化栈存储容量
stack:栈存储结构
initsize:栈初始化分配空间
**/
void stack_init(Stack*stack,int initsize)
{
    stack->base=(void **)malloc(sizeof(void**)*initsize);
    if(!stack->base)
        error("内存分配是吧");
    else
    {
        stack->top=stack->base;
        stack->stacksize=initsize;
    }
}
/**
功能:插入元素element为新的栈顶元素
stack:栈存储结构
element:要插入栈顶的新元素
size:栈元素实际尺寸
返回值:栈顶元素
**/
void *stack_push(Stack *stack,void *element,int size)
{
    int newsize;
    if(stack->top==stack->base+stack->stacksize)/**加入栈已满,分配多一倍的空间**/
    {
        newsize=stack->stacksize*2;
        stack->base=(void **)realloc(stack->base,(sizeof(void**)*newsize));
        if(!stack->base)
            return NULL;
        stack->top=stack->base+stack->stacksize;/**stack->base可能已经改变,所以要重新赋值**/
        stack->stacksize=newsize;
    }
    *stack->top=(void **)malloc(size);
    memcpy(*stack->top,element,size);           /**从源element所指的内存地址的起始位置开始拷贝size个字节到目标*stack->top所指的内存地址的起始位置中**/
    stack->top++;
    return*(stack->top-1);
}
/**
弹出栈顶元素
**/
void stack_pop(Stack*stack)
{
    if(stack->top>stack->base)
        free(*(--stack->top));
}
/**
得到栈顶元素
**/
void *stack_get_top(Stack *stack)
{
    void **element;
    if(stack->top>stack->base)
    {
        element=stack->top-1;
        return *element;
    }
    else
        return NULL;
}
/**
判断栈是否为空
1表示为空,0表示非空
**/
int stack_is_empty(Stack *stack)
{
    if(stack->top==stack->base)
        return 1;
    else
        return 0;
}
/**
销毁栈
**/
void stack_destroy(Stack *stack)
{
    void **element;
    for(element=stack->base;element<stack->top;element++)
        free(*element);
    if(stack->base)
        free(stack->base);
    stack->base=NULL;
    stack->top=NULL;
    stack->stacksize=0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值