关于栈的简单讲解

news2024/9/23 9:29:49

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


栈的概念

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

总结

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

遵循原则

栈的实现

#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;
}


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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot+minio 文件上传

前期准备 需要先安装minio文件服务器&#xff0c;请参考我上一篇文章 pom.xml 版本 本次使用的是springboot2.7.16 版本&#xff0c; minio 版本是8.2.2 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-pare…

1071.字符串的最大公因子

对于字符串s和t&#xff0c;只有在s t t t ... t t&#xff08;t自身连接1次或多次&#xff09;时&#xff0c;我们才认定 “t能除尽s”。 给定两个字符串str1和str2。返回最长字符串x&#xff0c;要求满足x能除尽str1且x能除尽str2 。 示例 1&#xff1a; 输入&#xf…

上位机图像处理和嵌入式模块部署(f103 mcu原理图)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 从linux卡片电脑转到mcu领域,第一个需要适应的估计就是原理图。之前学习linux的时候,我们大概只需要知道一些接口就好了,比如电源键、usb、网口、hdmi口、音频口、tf卡槽等等,整…

使用Java 读取PDF表格数据并保存到TXT或Excel

目录 导入相关Java库 Java读取PDF表格数据并保存到TXT Java读取PDF表格数据并保存到Excel 在日常工作中&#xff0c;我们经常需要处理来自各种来源的数据。其中&#xff0c;PDF 文件是常见的数据来源之一。这类文件通常包含丰富的信息&#xff0c;其中可能包含重要的表格数据…

冯喜运:5.27黄金暴跌大阴后出现“暂定符”今日黄金原油操作策略

【黄金消息面分析】&#xff1a;金价虽然有大阴线暴跌&#xff0c;但依然属于超买后的调整而非熊市&#xff0c;对中长线投资者来说只是市场洗牌。因此&#xff0c;在出现企稳迹象之后&#xff0c;随时关注反弹时机的启动。未来几日&#xff0c;黄金空头可能在进一步发力之前需…

pdf拆分成多个文件 pdf拆分成一页一页

pdf拆分成多个文件的方法。在现代办公环境中&#xff0c;PDF文件因其跨平台、保持格式一致等特性&#xff0c;成为了广泛使用的文件格式。然而&#xff0c;有时我们需要对PDF文件进行拆分&#xff0c;以便更好地管理和使用其中的内容。本文将详细介绍PDF拆分的方法和步骤&#…

智能改写工具,一键改写文章效率非常高

在当今快节奏的时代&#xff0c;效率成为了人们追求的重要目标之一。在文章创作领域&#xff0c;智能改写工具的出现为我们带来了极大的便利&#xff0c;它的高效率一键改写优势可以帮助创作者在几秒的时间里完成文章改写的工作&#xff0c;从此&#xff0c;也让创作者们实现了…

小明同学的考试分数统计:总分、平均分与方差计算进阶

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、原始方法介绍与问题发现 原始方法存在的问题 二、优化方案&#xff1a;使用列表简化代…

【OpenVINO™】在C#中使用 OpenVINO™ 部署 YOLOv10 模型实现目标

文章目录 1. 前言1.1 OpenVINO™ C# API1.2 YOLOv10 2. 模型获取2.1 源码下载2.2 配置环境2.3 下载模型 3. Yolov10 项目配置3.1 项目创建与环境配置3.2 定义模型预测方法3.2.1 定义目标检测模型方法3.2.2 使用OpenVINO™ 预处理接口编译模型 3.2 模型预测方法调用 4. 项目运行…

Java通过Html(ftl模板)生成PDF实战

Java通过Html(freemarker模板)生成PDF实战, 可支持商用 技术架构 springboot freemarker [pdfbox] flying-saucer-pdf 生成流程&#xff1a; freemarker: 根据数据填充ftl模板文件&#xff0c;得到包含有效数据的html文件&#xff08;包含页眉页脚页码的处理&#xff0c…

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

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

高性能、超小型的电源模块——TP2L-3W系列,3W 1.5KVDC 3KVDC 隔离宽范围输入,单、双输出 DC/DC 电源模块

TP2L-3W系列是一款高性能、超小型的电源模块&#xff0c;宽范围2:1,4:1输入&#xff0c;输出有稳压和连续短路保护功能&#xff0c;隔离电压为1.5KVDC、3KVDC工作温度范围为–40℃到85℃。特别适合对输出电压的精度有严格要求的地方&#xff0c;外部遥控功能对您的设计又多一项…

行业分析---造车新势力之小鹏汽车

1 背景 在之前的博客中&#xff0c;笔者分析了苹果《行业分析---我眼中的Apple Inc.》&#xff0c;随后也分析了电动汽车公司特斯拉《行业分析---马斯克的Tesla》和蔚来汽车《行业分析---造车新势力之蔚来汽车》&#xff0c;看到有不少读者朋友对此类文章也有些兴趣。 那么本篇…

基于springboot实现旅游管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现旅游管理系统演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本旅游管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助使用者在…

Docker基础篇之入门使用

文章目录 1. Docker的基本组成2. Docker平台架构3. 阿里云镜像加速4. Docker的Hello World入门案例5. 总结 1. Docker的基本组成 Docker的基本组成主要是有四部分&#xff0c;分别是镜像、容器和仓库。 镜像&#xff1a;Docker镜像就是一个只读的模版&#xff0c;镜像可以用来…

huggingface笔记: accelerate estimate-memory 命令

探索可用于某一机器的潜在模型时&#xff0c;了解模型的大小以及它是否适合当前显卡的内存是一个非常复杂的问题。为了缓解这个问题&#xff0c;Accelerate 提供了一个 命令行命令 accelerate estimate-memory。 accelerate estimate-memory {MODEL_NAME} --library_name {LIBR…

kettle学习之表的输入输出

需求 把表A里的数据传送到表B中&#xff0c;在此之前&#xff0c;清空表B内的数据 表输入 执行SQL脚本 表输出

OrangePi AIpro上手初体验:

OrangePi AIpro上手初体验&#xff1a; 1.基本外观及功能接口简介2.点亮OrangePi AIpro开发板3.OrangePi AIpro功能体验3.1.目标检测3.2.OCR文字识别3.3.图像的曝光增强3.4.系统的整体性能(运行ROS) 4.OrangePi AIpro体验总结4.1.硬件及软件生态&#xff1a;4.2.使用体验及性能…

独立乙游井喷成新趋势,真来抢市场还是只画大饼?

国产乙游市场又迎来了新变化。 进入5月份&#xff0c;独立乙女游戏如雨后春笋般冒了出来&#xff0c;两、三个人组成的制作组&#xff0c;没有任何程序协助和资金支持&#xff0c;全靠为爱发电来打造一款乙女游戏&#xff0c;成为了今夏乙游市场的新趋势。 目前已经有独立乙游…

Android Studio 中gradle的bin和all区别

1.在android studio中设置安装gradle时&#xff0c;真各种版本看到眼花缭乱&#xff0c;还有疑惑gradle-*.*-all.zip与gradle-*.*-bin.zip的区别是什么。下面解压如下: bin&#xff1a; all: 其实&#xff0c;用bin就可以了&#xff0c;all文件就是多了docs(文档)和src(源码)两…