数据结构之栈的实现

对比了之前的单链表和双向循坏链表这里的栈的实现就相对来说简单不少,当然有一点要主义此处我们说的栈和内存中的那个栈是两完全不一样的概念,数据结构中的栈本质上来讲是一种数据的存储形式,这里我们所采用的是数组的形式表达的栈,其数据存储类型的形式模仿了累死压栈,入栈的形式,下面我们来看看具体实现过程吧。

1.结构体的创建
typedef int STDataType;

typedef struct Stack
{
    STDataType* a;
    int top; //当作头节点的下标,具体实现中会展示其作用
    int capacity; //开辟空间的大小
}ST;
2.老样子先来初始化
void StackInit(ST* ps)
{
    ps->a = NULL;
    ps->top = 0;
    ps->capacity = 0;
}
3.栈的整体销毁
void StackInit(ST* ps)
{
    assert(ps);
    free(ps->a);
    ps->a = NULL;
    ps->capacity = ps->top = 0;
}
4.栈的最为核心的部分:插入
void StackPush(ST* ps , STDataType x)
{
    assert(ps);
    if(ps->top == ps->capacity)
    {
       int newCapacity = ps->capacity == 0 ? 4 : ps->capacity*2;
        STDataType* tmp = ( STDataType*) realloc (ps->a , sizeof( STDataType)*newCapacity);
        if(realloc == NULL)
        {
            printf("realloc出错");
            exit(-1);
        }
        ps->capacity = newCapacity;
        ps->a = tmp;
    }
    ps->a[ps->top] = x;
    ps->top++;
}
5.检查栈是否为空
bool StackEmpty (ST* ps)
{   //这一部比较重要有的操作如果栈为空的话运行会出错误
    assert(ps);
    return ps->top == 0;
}
6.栈的删除
void StackPop(ST* ps)
{
    assert(ps);
    assert(!StackEmpty(ps));
    ps->top--;
}
7.头的数据查找
STDataType StackTop(ST* ps)
{
    assert(ps);
    assert(!StackEmpty(ps));
    return ps->a[ps->top-1];
}
8.查找栈内部存储数的大小
  STDataType StackSize(ST* ps)
  {
    assert(ps);
    return ps->top;
  }

你可能感兴趣的:(数据结构,链表)