【数据结构】 栈的简单理解和基本操作

前言:本章介绍的主要内容是数据结构中栈的概念和栈的基本操作,包括:栈结构的定义、初始化、容量检查、判空、入栈、出栈、读取栈顶元素、读取栈内元素个数、栈的销毁等操作的具体实现。



1.为什么需要栈?

1.1栈的概念

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

栈的示意图


2.栈项目文件搭建

程序名功能
Stack.h定义结构体,引头文件,函数的声明
Stack.c各个功能函数的定义
test.c测试函数功能

栈的基本操作主要有:栈的初始化、判空、判满、取栈顶元素、在栈顶进行插入和删除,后下文将逐一实现。在栈顶插入元素称为入栈,在栈顶删除元素称为出栈。


2.1 栈结构的代码实现
typedef int STDataType;  

typedef struct Stack
{
    STDataType* data; //接收动态开辟的数组地址
    int top;      //栈顶
    int capacity; //容量
}ST; 

2.2 栈的初始化

栈顶指针和栈中元素的关系图

就是初始化成空栈,把 data指针置为NULL, topcapacity初始化为0.

void StackInit(ST* ps)   
{
    assert(ps); //传进来的地址一定不能为空
    
    ps->data = NULL;
    ps->top = ps->capacity = 0;
}

2.3 栈的检查容量操作

当我们使一个元素入栈的之前,我们往往需要判断一下栈是否为满栈,防止发生上溢的情况。

提问:怎么判断容量满了呢?

答案:ps->top == ps->capacity.

void StackCheckCapacity(ST* ps)
{
    assert(ps);  //ps不可为空
    
    if(ps->top == ps->capacity)
    {
        //注意细节,如果此时容量为0,就给4个,否则就翻倍
        int newcapacity = (ps->capacity == 0 ? 4 : 2 * ps->capacity ); 
        
        STDataType* newdata = (STDataType*)realloc(ps->data,newcapacity*sizeof(STDataType));
        
        if(newdata == NULL)
        {
            perror("错误原因:");
            exit(-1);
        }
        ps->data = newdata; //重新交接给ps->data
        
        ps->capacity = newcapacity;
    }
}

2.4 栈的判空操作

当我们弹出栈顶元素时,往往需要判断一下栈是否为空来防止发生下溢。

void StackPush(ST* ps,STDataType elem)
{
    assert(ps); //ps不能为空
    
    return ps->top == 0; //等于0就返回1,
}

2.5 栈的入栈操作

入栈时我们首先要判断栈是否为满栈,如果为满栈我们要首先追加存储空间,然后才能将元素入栈。

img

void StackPush(ST* ps,STDataType elem)
{
    assert(ps); 
    
    StackCheckCapacity(ps); //检查容量是否满了
    
    ps->data[ps->top++] = elem;
}

2.6 栈的出栈操作

出栈时我们首先要判断栈是否为空栈,然后只需要ps->top减去1就行。

void StackPop(ST* ps)
{
    assert(ps);
    
    assert(!StackEmpty(ps));
    
    ps->top--;
}

2.7 栈的读取元素数量操作

直接把ps->top的值返回

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

2.8 栈的读取栈顶操作

直接通过ps->top-1把值返回

STDataType StackTop(ST* ps)
{    
	assert(ps);        
	assert(!StackEmpty(ps));        
	return ps->data[ps->top - 1];
}

2.9 栈的销毁操作

直接free

void StackDestroy(ST* ps)
{    
	assert(ps);    
	free(ps->data);
	//当ps->data是NULL时候,free什么都不会做    
	ps->data = NULL;    
	ps->top = ps->capacity = 0;
}

3.源码链接

栈的代码实现


数据结构的栈内容到此介绍结束了,感谢您的阅读!!!如果内容对你有帮助的话,记得给我三连(点赞、收藏、关注)——做个手有余香的人

  • 45
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 47
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 47
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

林慢慢脑瓜子嗡嗡的

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

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

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

打赏作者

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

抵扣说明:

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

余额充值