数据结构——栈

本文详细介绍了栈的数据结构原理,包括栈的概念、后进先出特性,以及使用C语言实现栈的初始化、压栈、出栈、获取栈顶元素等操作,重点讨论了数组实现的优势。
摘要由CSDN通过智能技术生成

1.栈的概念及结构

        栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFOLast In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶
出栈:栈的删除操作叫做出栈。出数据也在栈顶

2.栈的实现

        栈的实现一般可以使用数组或者链表实现 ,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小

 所以我们创建一个栈的结构体:
typedef int STDataType;              //定义数据类型,方便不同数据类型使用;
typedef struct Stack
{
    STDataType* a;                      //创建一个数据类型指针,支持动态增长的栈
    int top;           // 栈顶
    int capacity;  // 容量 
}Stack;

        2.1初始化栈 

        在使用栈之前,需要初始化一下top与capacity 以及指针a。

void StackInit(Stack* ps)
{
    assert(ps);

    ps->a = NULL;
    ps->capacity = 0;  //表示栈的容量;
    ps->top = 0;         // 表示top指向栈顶元素的下一个位置
}

        2.2 入栈

void StackPush(Stack* pst, STDataType data)
{
    assert(pst);

    if (pst->top == pst->capacity)        //这里要先判断一下栈的容量,空间足够插入,
    {                                                    //空间不足,就进行扩容;
        int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
        STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType) * newcapacity);
        if (tmp == NULL)                        //判断一下是否扩容成功!
        {
            perror("realloc fail");
            return;
        }

        pst->a = tmp;                             //扩容成功后把tmp的地址给pst->a
        pst->capacity = newcapacity;      //扩容成功后别忘了capacity的值也更改一下
    }

    pst->a[pst->top] = data;            //把数据data入栈    
    pst->top++;                                //数据插入成功,把下标往后挪1位置
}

        2.3出栈

      //  栈的定义是后进先出 ,

      //   出栈的话,只需要把top- - 就好,下次有数据插入会直接覆盖;
void StackPop(Stack* pst)
{
    assert(pst);                // 不为空
    assert(pst->top > 0);    //当top<0的时候,说明该栈已经没有任何数据,

    pst->top--;                    //所以也就出不了栈,
}

         2.4获取栈顶元素 

STDataType StackTop(Stack* pst)
{
    assert(pst);                          // 不为空
    assert(pst->top > 0);

    return pst->a[pst->top - 1];        //注意top的位置,不要搞混!
}

        2.5 获取栈中有效元素个数 

int StackSize(Stack* pst)
{
    assert(pst);

    return pst->top;                //直接返回top的值就行;
}

        2.6检测栈是否为空,如果为空返回非零结果,如果不为空返回0 

bool STEmpty(Stack * pst)
    {
        assert(pst);

        return pst->top == 0;        //当top==0的时候,说明栈为空,返回true;
    }                                          //反正返回flase;

        2.7 销毁栈 

void StackDestroy(Stack* ps)
{
    assert(ps);        
    free(ps->a);        //把a指针开辟的空间给free,就可以了
    ps->a = NULL;        //顺便把a的指针置空
    ps->capacity = ps->top = 0;        //top与capacity别忘了也置0噢。

 总结:栈的核心是后进先出,也可以说先进后出!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值