栈的基本操作(C语言版)

概念

一种特殊的线性表,只能在固定的一端进行插入和删除操作,这个固定的一端称为栈顶,另外一端称为栈底,没有任何元素的栈称为空栈!!


栈的特性

先进后出或者说后进先出!!
另外,栈分为顺序栈以及链式栈


栈的功能

将数据从一种序列改变为另外一种序列(改变数据序列


栈的基本操作

动态顺序栈的结构体———>其中包括动态数组(_array)空间容量(_capacity)以及元素个数(_top)

typedef int DataType;
typedef struct StackD
{
    DataType* _array;
    int _capacity;
    int _top;
}StackD;

栈的初始化

// 栈的初始化 
void StackDInit(StackD* s, int capacity)
{
    assert(s);                         //参数检测

s->_array = (DataType*)malloc(sizeof(DataType)* capacity);           // 申请空间
if (NULL == s->_array)                                           //判空
{
    assert(0);
    return;
}

s->_capacity = capacity;                                    //重置容量
s->_top = 0;                                                //无元素,top为零
}

入栈和出栈操作

// 入栈 
void StackDPush(StackD* s, DataType data)
{
    assert(s);                                         //参数检测

if (s->_top < s->_capacity)                         //栈未满,直接入栈
{
    s->_array[s->_top] = data;
    s->_top++;                               
}
else                                                //栈已满,扩容后再入栈
{
    int capacity = 2 * s->_capacity;
    s->_array = (DataType*)realloc(s->_array, sizeof(DataType)*capacity);          //扩容
    s->_capacity = capacity;                                                   //重置容量
    s->_array[s->_top] = data;                                            //入栈
    s->_top++;
}
}

// 出栈
void StackDPop(StackD* s)
{
    assert(s);                                    //参数检测

if (StackDEmpty(s))
{
    printf("栈已空,无法出栈!!\n");
    return;
}
else                           //栈顶减一即出栈
    s->_top--;
}

获取栈顶元素、获取栈中元素个数以及判断栈是否为空

// 获取栈顶元素 
DataType StackDTop(StackD* s)
{
    assert(s);                            //参数检测

if (StackDEmpty(s))
{
    printf("栈已空,无栈顶元素!! \n");
    return 0;
}

return s->_array[s->_top - 1];
}

// 获取栈中元素个数 
int StackDSize(StackD* s)
{
    assert(s);

return s->_top;
}

// 检测栈是否为空 
int StackDEmpty(StackD* s)
{
    assert(s);

    if (0 == s->_top)
    return 1;
else
    return 0;
}

栈的应用

1、括号匹配问题!
2、逆波兰表达式(后缀表达式)问题!
3、迷宫问题!

想这三个问题的解决方式,记得关注一下哦!!或者点开我的主页,进行查看!!
三天之内解决以上问题!!!
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值