栈的讲解与实现(C语言)数据结构

本文介绍了栈这一特殊线性表的数据结构,强调了其后进先出(LIFO)特性,并展示了使用数组实现栈的C语言代码。内容包括栈的初始化、销毁、入栈、出栈、获取栈顶元素、检查栈是否为空等基本操作。同时,文章讨论了数组作为栈实现的优势。
摘要由CSDN通过智能技术生成

栈的概念与结构:

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

压栈:栈的插入操作叫做压栈,压入的数据在栈顶。

出栈:栈的删除操作叫出栈。出的数据也在栈顶。

 栈的实现:

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

以下为栈的代码实现:

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

typedef int STDateType
typedef struct Stack
{
    STDateType *a;
    int top;
    int capacity;
}ST;

//初始化栈
void StackInit(ST* ps);
//销毁栈
void StackDestory(ST* ps);
//入栈
void StackPush(ST *ps, STDateType x);
//出栈
void StackPop(ST* ps);
//获取栈顶元素
STDateType StackTop(ST* ps);
//获取栈顶有效元素个数
int StackSize(ST* ps);
//检查栈是否为空,如果为空返回非零结果,如果不为空返回0
bool StackEmpty(ST* ps);

初始化栈:

void StackInit(ST* ps)
{
    assert(ps);
    ps->a=NULL;
    ps->top=0;
    ps->capacity=0;
}

销毁栈:

void StackDestory(ST* ps)
{
    assert(ps);
    free(ps->a);
    ps->capacity=0;
    ps->top=0;
}

入栈:

void StackPush(ST*ps,STDateType x)
{
    if(ps->top==ps->capacity)
    {
        int newCapacity=ps->capacity==0?4:(2*ps->capacity);
        STDateType* tmp=(STDateType*)realloc(sizeof(newCapacity*STDateType));
        if(tmp==NULL)
        {
            printf("realloc is fail\n");
            exit(-1);
        }
        ps->a=tmp;
        ps->capacity=newCapacity;
    }    
    ps->a[ps->top]=x;
    ps->top++;
}

出栈:

void StackPop(ST* ps)
{
    assert(ps);
    assert(!StackEmpty(ps)); //防止出栈溢出
    ps->top--;
}

获取栈顶元素:

STDateType StackTop(ST* ps)
{
    assert(ps);
    assert(!StackEmpty(ps));//如果栈为空就不再获取栈顶
    return ps->a[ps->top-1];
}

获取栈顶有效元素个数:

int StackSize(ST* ps)
{
    assert(ps);
    return ps->top;
}

检查栈顶是否为空:

bool StackEmpty(ST* ps)
{
    assert(ps);
    return ps->top == 0;
}

以上就是对栈的实现与讲解。

感谢老铁看到这里,如果文章对你有用的话请给我一个支持一下,感激不尽!

在下才疏学浅,一点浅薄之见,欢迎各位大佬指点

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

loveandsharef

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值