关于栈的简单讲解

哈喽,小伙伴们大家好呀,今天给大家带来栈、队列的那些知识点。


栈的概念

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

总结

一种线性表,进行数据插入和删除的一端为栈顶

遵循原则

栈的实现

#include<stdio.h>
#include<assert.h>
#include<stdbool.h>
typedef int STDataType;
typedef struct Stack
{
    STDataType* a;//数组
    int top;        // 栈顶
    int capacity;  // 容量 
}Stack;
// 初始化栈 
void StackInit(Stack* ps);
// 入栈 
void StackPush(Stack* ps, STDataType x);
// 出栈 
void StackPop(Stack* ps);
// 获取栈顶元素 
STDataType StackTop(Stack* ps);
// 获取栈中有效元素个数 
int StackSize(Stack* ps);
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
bool StackEmpty(Stack* ps);
// 销毁栈 
void StackDestroy(Stack* ps);

首先还是一样的初始化栈,关于初始化,我们之前已经讲过了许多次了,那么今天我们再来最后一次写初始化。

总结一下初始化和销毁部分主要写的内容

初始化部分:对于结构体的数组或者指针等进行解引用时通常置为空也就是NULL,另外对于一些如int类型的赋值为0。

销毁部分:与初始化部分相似,但从理论上则与初始化互逆。

温馨提醒:free完一个结构体变量后就要讲其置为空,且int类型还原为0,是一个好习惯哦!

入栈部分

这个与先前的链表尾插的思路相似

思路:先判ps指针不为空,再通过判断栈顶(top)是否与空间相等,如果相等,增加间,再将newcapacity传给capacity,将tmp给数组a,最后把x给到数组p->a[ps->top],并且栈顶元素个数也要++

出栈部分

相较于入栈而言,出栈就变得很简单。出栈顾名思义就是从栈内将元素一个一个得往外移出,并且移出时栈顶元素个数要减减

那么想要元素出栈,就要先获取栈顶元素,那么如何获取呢?

栈顶元素获取

思路:先断言指针不为空,再返回数组元素

栈顶元素的有效个数

思路:先断言指针不为空再返回ps->top

检测栈是否为空

思路:直接返回ps->top ==0;即可,因为bool类型会对给出的条件做出判断,如果为真则返回0,反之,则返回一个不为0的数。

例题讲解

题目要求:左括号与右括号若匹配,则返回true,反之,返回,false

思路:在有栈的情况下通过循环依次将左括号入栈(注意不能少了s++),若遇到非左括号的则进入判空环节,如果非空,则取栈然后进行与右括号匹配(注意:取完后要删除),若匹配成功则返回true, 否则销毁并返回false,反之如果为空,则销毁并返回false

源代码:

typedef char STDataType;

typedef struct Stack

{

    STDataType* a;

    int top;        // 栈顶

    int capacity;  // 容量

}Stack;

// 初始化栈

void StackInit(Stack* ps);

// 入栈

void StackPush(Stack* ps, STDataType x);

// 出栈

void StackPop(Stack* ps);

// 获取栈顶元素

STDataType StackTop(Stack* ps);

// 获取栈中有效元素个数

int StackSize(Stack* ps);

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

bool StackEmpty(Stack* ps);

// 销毁栈

void StackDestroy(Stack* ps);

void StackInit(Stack* ps)

{

    assert(ps);

    ps->a = NULL;

    ps->capacity = 0;

    ps->top = 0;

}

void StackPush(Stack* ps, STDataType x)

{

    assert(ps);

    if (ps->top == ps->capacity)

    {

        int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;

        STDataType* tmp = (STDataType*)realloc(ps->a, newcapacity * sizeof(STDataType));

        if (tmp == NULL)

        {

            perror("realloc fail");

            exit(1);

        }

        ps->capacity = newcapacity;

        ps->a = tmp;

    }

    ps->a[ps->top] = x;

    ps->top++;

}

STDataType StackTop(Stack* ps)

{

    assert(ps);

    //assert(ps->top > 0);

    return ps->a[ps->top - 1];

}

void StackPop(Stack* ps)

{

    assert(ps);

    ps->top--;

}

bool StackEmpty(Stack* ps)

{

    assert(ps);

    return ps->top == 0;

}

int StackSize(Stack* ps)

{

    assert(ps);

    return ps->top;

}

void StackDestroy(Stack* ps)

{

    assert(ps);

    free(ps->a);

    ps->a = NULL;

    ps->top = ps->capacity = 0;

}

bool isValid(char* s) {

    Stack st;

    StackInit(&st);

    while(*s)

    {

        if(*s == '(' || *s == '[' || *s == '{')

        {

            StackPush(&st, *s);

        }

        else

        {

            if(StackEmpty(&st))

            {

                StackDestroy(&st);

                return false;

            }

            char top = StackTop(&st);

            StackPop(&st);

            if((top == '(' && *s != ')')

            || (top == '[' && *s != ']')

            || (top == '{' && *s != '}') )

            {

                StackDestroy(&st);

                return false;

            }

        }

        ++s;

    }

    bool ret = StackEmpty(&st);

    StackDestroy(&st);//这里的销毁别忘了哦

    return ret;

}


本文总结

1.初始化与销毁通用思路模板

  初始化:对于像指针等,初始化时置为空即可,也就是NULL; 对于像int类型的变量一般初始化为0。

销毁:第一步先判空,再使用free释放指针,之后就与初始化相同

2.入栈与出栈(取栈)通用思路模板

入栈:

入栈时,先思考是否已经有了足够空间,若无空间则使用malloc或者reallocation申请空间或增加空间容量,申请或扩容成功后,要将该空间转移到需要该空间的临时创建的变量中,再对应赋值给需要该空间的原变量和原空间。

eg.申请的新空间newcapacity, 新创建的数组tmp

                             ↓                     ↓

  pq->capacity  =  newcapacity               pq->a  =  tmp  

3.判断空间是否充足代码模板

if (ps->top == ps->capacity)
{
    int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
    STDataType* tmp = (STDataType*)realloc(ps->a, newcapacity * sizeof(STDataType));
    if (tmp == NULL)
    {
        perror("realloc fail");
        exit(1);
    }
    ps->capacity = newcapacity;
    ps->a = tmp;
}


那么本篇文章的内容就先给大家讲到这里,喜欢我的朋友可以给我点个赞哦,我们下期见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/649442.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

多线程编程(12)之HashMap1.8源码分析

之前已经分析过了一版1.7版本的HashMap&#xff0c;这里主要是来分析一下1.8HashMap源码。 一、HashMap数据结构 HashMap 是一个利用散列表&#xff08;哈希表&#xff09;原理来存储元素的集合&#xff0c;是根据Key value而直接进行访问的数 据结构。 在 JDK1.7 中&#xff…

MongoDB数据库清理策略: 自动化过期数据删除实战

1、引言 随着应用程序和业务数据的持续增长&#xff0c;有效地管理数据库存储空间成为维护系统性能的关键。在MongoDB这类NoSQL数据库中&#xff0c;定期清理过期数据变得尤为重要&#xff0c;这不仅能释放宝贵的存储资源&#xff0c;还能优化查询性能&#xff0c;确保数据库运…

[算法] 优先算法(三):滑动窗口(上)

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …

Web安全技术期末考查-vulhub靶场搭建及漏洞复现

一、实验目的与要求 能根据报告找到难度适中的漏洞&#xff0c;搭建弱点环境&#xff0c;并验证该漏洞&#xff1b; 2.能给出该漏洞的修复建议。 二、实验原理与内容 漏洞原理 漏洞原理通常指的是计算机系统、软件、网络或其他技术系统中存在的安全缺陷&#xff0c;这些缺陷…

Ubuntu18 配置FFmpeg开发环境 (Vscode+CMake)

关于Vscode插件安装不再赘述&#xff0c;本文主要讲解如何配置FFmpeg的开发环境以及CMake文件写法&#xff0c;如果不知道该安装什么插件请看本文&#xff1a; Ubuntu配置Vscode 文章目录 1.安装FFmpeg开发包2.配置Vscode项目3.使用C语言验证FFmpeg版本 1.安装FFmpeg开发包 更新…

粉丝问,有没有UI的统计页面,安排!

移动应用的数据统计页面具有以下几个重要作用&#xff1a; 监控业务指标&#xff1a;数据统计页面可以帮助用户监控关键业务指标和数据&#xff0c;例如用户活跃度、销售额、转化率等。通过实时更新和可视化呈现数据&#xff0c;用户可以及时了解业务的整体状况和趋势。分析用…

深入剖析—【服务器硬件】与【Nginx配置】:从基础到实战

服务器硬件部分&#xff1a; Processor (CPU)&#xff1a;服务器的计算核心&#xff0c;负责处理数据和执行程序。Memory (RAM)&#xff1a;用于暂时存储和快速访问数据&#xff0c;决定了系统的运行速度和并发处理能力。Storage (HDD/SSD)&#xff1a;长期存储数据的设备&…

基于JT/T808、JT/T1078、苏标、粤标视频主动安全监控

1.概述 如下图是以实时视频点播与部标机产生了主动安全报警&#xff0c;各个服务之间的交互流程说明。 整个系统有以下几个核心组件组成&#xff1a; 1&#xff1a;系统业务端&#xff1a;车载监控业务系统&#xff0c;给用户提供车载监控整套业务流程与界面呈现&#xff1b;…

Docker安装Oracle11g数据库

操作系统&#xff1a;centOS9使用此方法检查是否安装Docker&#xff1a;docker --help&#xff0c;如果有帮助文件则证明安装成功使用此语句检查Docker是否正在运行&#xff1a;docker images&#xff0c;实际上是查看本地镜像如果发现未运行则开启Docker&#xff1a;systemctl…

rapidssl泛域名https600元一年

泛域名https证书也可以称之为通配符https证书&#xff0c;指的是可以用一张https证书为多个网站(主域名以及主域名下的所有子域名网站)传输数据加密&#xff0c;并且提供身份认证服务的数字证书产品。RapidSSL旗下的泛域名https证书性价比高&#xff0c;申请速度快&#xff0c;…

使用 FileZilla 在 Windows 和 Ubuntu 之间传文件

网线一端插在板子的WAN口上&#xff0c;另一段插在电脑上&#xff0c;然后要配一下板子的IP。 板侧&#xff1a; 使用串口链接板子与PC端&#xff1b; 输入指令 ifconfig eth0&#xff08;具体看wan口对应哪一个&#xff09; 192.168.1.99 PC端配置&#xff1a; 打开网络设…

操作系统实验:进程和线程同步和互斥(生产者消费者问题,睡觉的理发师问题)

1.生产者消费者问题&#xff08;信号量&#xff09; 参考教材中的生产者消费者算法&#xff0c;创建5个进程&#xff0c;其中两个进程为生产者进程&#xff0c;3个进程为消费者进程。一个生产者进程试图不断地在一个缓冲中写入大写字母&#xff0c;另一个生产者进程试图不断地…

sqlserver——查询(四)——连接查询

目录 一.连接查询 分类&#xff1a; 内连接&#xff1a; 1. select ... from A&#xff0c;B &#xff1b; 2. select ..from A&#xff0c;B where ..&#xff1b; 3.select ...,... from A join B on... 4. where 与 join...on 的区别 5. where位置的先后 导语&#xff1…

开发心电疾病分类的深度学习模型并部署运行于ARM虚拟硬件平台(AVH)

目录 一、ARM虚拟硬件平台介绍 二、心电疾病分类模型介绍 三、部署流程 3.1 基于百度云平台订阅虚拟硬件镜像 3.2 安装编译相关组件 3.3 数据加载 3.4 模型转换 方式一&#xff1a; tensorflow模型转换为onnx模型&#xff0c;onnx模型转换为TVM模型 方式二&#xff1…

【操作系统】发展与分类(手工操作、批处理、分时操作、实时操作)

2.操作系统发展与分类 思维导图 手工操作阶段&#xff08;此阶段无操作系统&#xff09; 需要人工干预 缺点&#xff1a; 1.用户独占全机&#xff0c;资源利用率低&#xff1b; 2.CPU等待手工操作&#xff0c;CPU利用不充分。 批处理阶段&#xff08;操作系统开始出现&#x…

从零入门激光SLAM(二十一)——FAST-LIO2论文解析

FAST-LIO2: Fast Direct LiDAR-Inertial Odometry 论文地址&#xff1a;https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber9697912 代码&#xff1a;https://github.com/hku-mars/FAST_LIO 一、文章概述 1.问题导向 基于视觉传感器的高分辨率和高精度的实时密…

Excel 取出每组最后一行

Excel的前两列是两层的分组列&#xff0c;后两列是明细 ABCD1CM11112CM12123CM13134CM14145CM25156CM26167BM11218BM12229BM232310AM113111AM323212AM333313AM3434 现在要取出每小组的最后一行&#xff1a; ABCD1CM14142CM26163BM12224BM23235AM11316AM3434 使用 SPL XLL sp…

编译原理 期末复习笔记整理(上)

资料借鉴&#xff1a; 【编译原理】期末复习 零基础自学_哔哩哔哩_bilibili 编译原理笔记 第一章 引论 1.编译原理逻辑过程&#xff1a; 词法分析 语法分析 语义分析 中间代码生成 编译代码生成 2.词法分析 任务: 输入源程序&#xff0c;对…

SpringBootWeb 篇-深入了解 Mybatis 删除、新增、更新、查询的基础操作与 SQL 预编译解决 SQL 注入问题

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 Mybatis 的基础操作 2.0 基础操作 - 环境准备 3.0 基础操作 - 删除操作 3.1 SQL 预编译 3.2 SQL 预编译的优势 3.3 参数占位符 4.0 基础操作 - 新增 4.1 主键返回…

不拍视频,不直播怎么在视频号卖货赚钱?开一个它就好了!

大家好&#xff0c;我是电商糖果 视频号这两年看着抖音卖货的热度越来越高&#xff0c;也想挤进电商圈。 于是它模仿抖音推出了自己的电商平台——视频号小店。 只要商家入驻视频号小店&#xff0c;就可以在视频号售卖商品。 具体怎么操作呢&#xff0c;需要拍视频&#xf…