栈的顺序表实现

//顺序栈的实现
//清空了,只是栈顶指针从头开始,栈所占用空间已在。销毁,就是栈内存释放,这个栈就死亡了
//链表形式的需要逐个结点释放。如果是动态分配,整体一次释放
#include
#define STACR_INIT_SIZE 100
#define  STACR_ADD_SIZE 10
typedef char ElemType;
typedef int status;
typedef struct
{
    ElemType  *base;
    ElemType   *top;
    int stacksize;
}stack;
//初始化栈  
status initstack(stack *s)
{
    //进行空间分配  给数据成员进行初始化
    s->base = (ElemType*)malloc(sizeof(ElemType)*STACR_INIT_SIZE);
    if (!s->base) {
        return 0;
    }
    s->top = s->base;
    s->stacksize = STACR_INIT_SIZE;
    return 1;
}
//销毁栈
status destory(stack *s)
{
    free(s->base);
}
//清栈
status clearstack(stack *s)
{
    s->base = s->top;
}
//检验栈是否为空  是返回0 否返回1
status isStackempty(stack s)
{
    if (s.base == s.top) {
        return 0;
    }
    return 1;
}
//返回栈的长度  已使用的长度 ?还是栈初始化的长度 ?
int stacklength(stack s)
{}
//返回栈顶元素的数据存储部分
status gettop(stack s, ElemType *e)
{
    *e = *s.top;
    return 1;
}
//进行压栈
status  push(stack *s, ElemType e)
{
    //判断栈是否已满
    if (s->top - s->base >= s->stacksize)
    {
        s->base = (ElemType*)realloc(s->base, sizeof(ElemType)*(s->stacksize + STACR_ADD_SIZE));//会复制原来的数据  但是指针的指向呢
        if (!s->base){
            return 0;
        }
        s->top = s->base + s->stacksize;//头指针的指向要重新确定
        s->stacksize += STACR_ADD_SIZE;//更新长度
    }
    //s->top= (ElemType*)malloc(sizeof(ElemType));  已经进行过内存的分配  直接用
    *s->top = e;//赋值
    s->top++;//指针后移
    return 1;
}
//弹出栈顶
status Pop(stack *s, ElemType *e)
{
    //弹出之前要判断栈是否为空
    if (s->base == s->top)
    {
        return 0;
    }
//语句实现的顺序我还不懂  *e=*--s->top
    s->top--;
   *s->top = *e;
   return 1;

}

你可能感兴趣的:(c语言)