栈和队列的习题详解(1):有效的括号

news2024/9/22 4:15:39

前言:

  在差不多二十天前小编写过栈和队列的详解,本来我想当时写完那两个结构之后就继续写它们的习题,但是写完那几篇博客以后,我就开始狂玩了十几天,我在上篇博客也说过,导致我在刚开学的时候就忘记了这个习题的写法了,再次听完习题讲解后,我痛定思痛,决定现在立马写篇博客来对于习题的讲解,下面废话不多说,开始今天的习题之旅~


目录

1.有效的括号 

 1.1.题目的展示

 1.2.题目的大致解释

 1.3.习题的文字讲解

 1.4.习题代码以及提交结果展示 

2.总结


正文:

1.有效的括号 

 1.1.题目的展示

  老规矩,再讲借题目之前,小编先把题目地址给出来:20. 有效的括号 - 力扣(LeetCode)

 1.2.题目的大致解释

  这个题目乍一看,似乎是一个比较难以理解的题目,小编当初也是认为这个题目理解起来算是比较有难度的,此时这个题目是括号配对问题,可能很多读者朋友会问:括号是如何进行配对?我先来稍微解释一下这个题目:

  括号配对其实就是我们所认识的小括号,中括号,大括号,它们想要实现括起来这个功能,那就必须要左右括号是一起的,类似下图这样:

  当然,括号和括号之间也是可以进行复合的,但是左括号和右边=括号是必须配对在一起的,就类似下图这样:

  当然,也有不配对的情况,就比如左括号或者右括号是单独出现的,后者是左右括号不匹配的情况,如下图所示:

  以上便是这个题目让我们解决的大致问题,当时我还是有点没有思路的,但是小编当初是学习完栈和队列以后在看的这些算法题,我自然而然的认为这个题必然和栈和队列有关,但我不知道到底是哪个数据结构,于是乎小编在听完老师的讲解以后,便知道了这个题的做题方法,这个题是用栈来实现的,实现的方法也是很巧妙,下面小编就开始对这个题目进行讲解。

 1.3.习题的文字讲解

  这个解题方法是通过栈的结构来实现的,小编在之前的博客说过,栈的结构特点是后进先出,由栈顶入,从栈顶出,类似一个瓶子一样,所以小编的做题方法便是我们可以把左括号放入栈中,然后如果我们碰到了右括号,那么我们便可以通过比较栈顶元素和右括号是否配对来看看这个括号是否有效,因为小编刚刚也说过,栈有着后进先出的特点,所以最后一个进的左括号和第一个右括号自然就是配对的,所以我们比较完成以后,就可以出栈,然后继续和之后进行入栈或者配对,所以才此时我们肯定是用到了循环的,并且此时我们可以通过使用指针的方法来对于字符串的每一个字符进行读取,所以此时循环的条件自然就是这个指针不能够是‘\0’,我们的目的就是遍历整个字符串,来看看括号是否配对,如果成功配对了的话,此时我们的栈中的元素肯定就是空的,如果栈不为空,证明此时括号并不匹配,可能出现了左括号多于右括号的情况,所以循环结束以后,我们还得再写一个if语句来判断栈是否为空,如果不为空直接返回false,如果为空就返回true,此时这个题目算是写完了,可能很多读者朋友看到这么长的文字,可能会不想去读,所以小编就拿一个例子来通过图文的方式来带领各位去知道这个题目的做题方法:

 1.4.习题的图文搭配代码讲解

  首先,我们需要先把栈这个数据结构写出来(我的建议就是直接把自己以前写过的复制粘贴过来,毕竟我们都是CV程序员(狗头保命)),然后我们便可以设置好一个栈,然后设置好一个指针去指向字符串,我们通过这个指针来对字符串每一个字符进行读取,然后我们便可以进入到循环,首先我们需要先确保此时指针的指向是否为左括号,如果就是左括号,那么便可以入栈,很明显,此时就是做括号,所以我们选择入栈,下面是相应的代码和图:

    char* arr = s;
    ST s1;
    STInit(&s1);
    while (*arr != '\0') {
        if (*arr == '(' || *arr == '[' || *arr == '{') {
            STPush(&s1, *arr);
       }

  之后,我们让指针往后走一步,再去判断此时是否为左括号,很明显此时为右小括号,所以此时我们就需要和栈顶元素进行配对,。但是这里有一个需要注意的点,我们不能直接将栈顶数据和右括号进行配对,因为此时我们无法确保真的有栈顶元素,就比如上面小编举例的只有右括号的情况,所以此时我们需要去判断这个栈是否为空,如果为空的话我们直接返回false,如果不为空的话我们在进行配对操作,配对成功我们出栈,然后让字符串继续往后找,如果不匹配直接返回false,很显然,此时可以配对,所以我们直接进行出栈就好了,代码和解释图如下图所示:

        } else {
            if (panduan(&s1))
                return false;
            char ch = STTop(&s1);
            if (ch == '(' && *arr == ')' || ch == '[' && *arr == ']' ||
                ch == '{' && *arr == '}') {
                STPop(&s1);
            } else {
                STDestroy(&s1);
                return false;
            }
        }
        arr++;

  之后我们在通过循环继续往后找左括号,并且搭配右括号进行配对,经过不断的重复我们便可以结束循环,当然我们在结束循环的时候,并不代表着此时括号是一定匹配的,所以此时我们仍需判断栈是否为空,只有栈为空,才可以说明此时括号是有效的,否则直接返回false,此时不难发现这个例子是正确的,最后会呈现下面的效果:

  此时我们就实现了有效括号的配对,也代表着这个题目正式的写完了,可能点开这篇文章的读者朋友只想知道代码如何写,或者听完了想看看完整代码是什么样子的,不要着急,下面就进行代码展示环节!

 1.4.习题代码以及提交结果展示 

typedef char STDataType;
typedef struct stack {
    STDataType* arr; // 数组,类型可能不是一定的所以用typedef替换一下
    int capacity; // 总空间大小
    int top;      // 栈顶表示
} ST;
void STInit(ST* ps) {
    ps->arr = NULL;
    ps->capacity = ps->top = 0; // 总空间个数和有用空间个数都初始化为0
}
void STDestroy(ST* ps) {
    if (ps->arr) // 先判断是否进行动态内存开辟了
    {
        free(ps->arr);
    }
    ps->capacity = ps->top = 0;
}
void STPush(ST* ps, STDataType x) // 类似顺序表的尾插
{
    if (ps->capacity == ps->top) {
        int newcaopacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
        STDataType* arr1 =
            (STDataType*)realloc(ps->arr, newcaopacity * sizeof(STDataType));
        assert(arr1);
        ps->arr = arr1;
        ps->capacity = newcaopacity;
    } // 扩容完成
    ps->arr[ps->top++] = x;
}
bool panduan(ST* ps) {
    assert(ps);
    return ps->top == 0; // 这个是来判断栈是不是空了
}
void STPop(ST* ps) {
    assert(ps);
    assert(!panduan(ps));
    ps->top--;
}
STDataType STTop(ST* ps) {
    assert(ps);
    assert(!panduan(ps));
    return ps->arr[ps->top - 1];
}
int STSize(ST* ps) { return ps->top; }
bool isValid(char* s) {
    char* arr = s;
    ST s1;
    STInit(&s1);
    while (*arr != '\0') {
        if (*arr == '(' || *arr == '[' || *arr == '{') {
            STPush(&s1, *arr);
        } else {
            if (panduan(&s1))
                return false;
            char ch = STTop(&s1);
            if (ch == '(' && *arr == ')' || ch == '[' && *arr == ']' ||
                ch == '{' && *arr == '}') {
                STPop(&s1);
            } else {
                STDestroy(&s1);
                return false;
            }
        }
        arr++;
    }
    if (!panduan(&s1))
        return false;
    STDestroy(&s1);
    return true;
}

2.总结

  本来小编是都想着直接把栈和队列四个习题在一个文章进行呈现的,但在我写完有效的括号这个习题后,发现字数已经是很多了,其它三个题都涉及着我们需要写一些函数的实现,如果一起写就不好体现每个题的价值,于是这次我就大胆尝试把这些小题都分出来写,由于这是第一次尝试,小编肯定有写的不足的情况,若有错误或者写的不好,恳请各位大佬在评论区指出,我一定会及时汲取自己的不足来对之后的文章进行改善,今天这个题目是很重要的,各位读者朋友一定要好好去理解,那么,我们下一篇文章见啦!

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

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

相关文章

mac的使用

mac使用python的问题 对于python的虚拟环境,其实是基于已经安装到本地的python来安装不同的包。(之前我的mac上只安装了python3.9.6 ,安装的位置为/usr/bin/python3)然后我在vscode里怎么找都找不到如何弄一个python3.7.6 的版本…

使用Pywin32和其他库控制Office软件进行自动化操作

目录 引言 Pywin32概述 基本概念 安装与配置 基本使用 Word自动化操作 文档创建与编辑 文档格式化 宏的运行 PowerPoint自动化操作 演示文稿的创建与编辑 幻灯片内容的格式化 高级应用:从Word自动生成PPT 读取Word文档中的内容。 保存生成的PowerPoi…

NetSuite AI 图生代码

去年的ChatGPT热潮期间,我们写过一篇文章说GTP辅助编程的事。 NetSuite GPT的辅助编程实践_如何打开netsuite: html script notes的视图-CSDN博客文章浏览阅读2.2k次,点赞4次,收藏3次。作为GPT综合症的一种表现,我们今朝来探究下…

SOMEIP_ETS_076: Wrong_Method_ID

测试目的: 验证当设备(DUT)接收到一个包含错误方法ID的SOME/IP请求时,是否能够返回错误消息或忽略该请求。 描述 本测试用例旨在检查DUT在处理一个echoUINT8方法的SOME/IP消息时,如果消息中包含的方法ID不正确&…

NC 寻找峰值

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 给定一个长度…

12:以太网口模块布局

1.以太网口布局重点 ①两对差分线对应百兆网口,4对差分线对应千兆网口 ②以太网口重点是处理2对差分线,且优先走顶层 2.抽头信号要加粗:20mil-30mil

Unity学习路线

目录 一、Unity官方推荐路线二、AI总结的学习路线1、Unity学习路线图(文言一心)一、基础入门(初级)二、进阶提升(中级)三、高级深入(高级)四、专家级探索 注意事项 2、Unity学习路线…

【例003】利用MATLAB绘制有趣平面图形

题目: 用 ezplot 画出由方程 sin ⁡ ( x 2 m y 2 1000 ) cos ⁡ ( x y ) \sin(x^2\frac{my^2}{1000})\cos(xy) sin(x21000my2​)cos(xy) 确定隐函数的图形。 求解: 我们分别取m为100,1000,10000不同的值,绘制不同情况下的图…

计算机毕业设计选题推荐-公司考勤管理系统-Java/Python项目实战

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

解决银河麒麟中`netstat`命令不可用

解决银河麒麟中netstat命令不可用 1、问题2、解决方案3、 总结 💖The Begin💖点点关注,收藏不迷路💖 1、问题 在银河麒麟服务器操作系统中,netstat命令可能不可用,因为它属于未安装的net-tools软件包。 2…

LabVIEW程序员的护城河是什么

LabVIEW程序员的护城河在于他们深厚的行业经验和对特定领域的深刻理解,这使得他们在工业自动化、测试与测量等领域中难以被轻易取代。然而,随着AI技术的进步,部分基础性和重复性的工作可能会逐渐被AI接管,但LabVIEW程序员的独特技…

WEB渗透Win提权篇-合集(上)

完整20w字笔记: 夸克网盘分享 AppLocker GPO HKLM\SOFTWARE\Policies\Microsoft\Windows\SrpV2(keys:Appx、Dll、Exe、Msi 和脚本)。 列出 AppLocker 规则 PowerView PS C:\> Get-AppLockerPolicy -Effective | select -Expa…

0901python打印异常信息

python异常处理 1.目的2.python异常处理办法2.1直接打印异常信息2.2打印异常具体位置 3.日志处理3.1代码 4.结果输出 1.目的 在java中,我们经常会有统一异常处理以及日志打印模块,同样,python也是,在yolo中很多位置就是用到了这个,比如校验图片的尺寸,后缀名,设备状态等等… …

苹果笔记本电脑能不能玩游戏?苹果电脑玩游戏咋样?

过去Mac玩不了游戏最大的问题,就是图形API自成一体,苹果既不支持微软的DirectX,同时为了推广自家的Metal图形API,又对OpenGL和Vulkan两大主流的通用API敬而远之。游戏生态、硬件瓶颈让苹果电脑不适合玩游戏。 不过说到底&#xf…

C++ 设计模式——备忘录模式

C 设计模式——备忘录模式 C 设计模式——备忘录模式1. 主要组成成分2. 逐步构建备忘录模式步骤1: 创建备忘录步骤2: 实现原发器步骤3: 创建管理者(负责人)类步骤4: 客户端使用 3. 备忘录模式 UML 图UML 图解析 4. 备忘录模式的优点5. 备忘录模式的缺点6…

(1)冒泡排序和其优化

一 冒泡排序 1.1 冒泡排序概念 冒泡排序(Bubble Sort)是一种交换排序,基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序记录位置。 假设要对无序数列{2,3,4,5,6,7,8,1}排序:…

从一到无穷大 #34 从Columnar Storage Formats评估到时序存储格式的设计权衡

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 文章目录 引言Parquet / ORC功能与结构对比差异Indexes and Filters压缩影响 TsFile总结 引言 …

使用 Milvus Lite、Llama3 和 LlamaIndex 搭建 RAG 应用

大语言模型(LLM)已经展示出与人类交互并生成文本响应的卓越能力。这些模型可以执行各种自然语言任务,如翻译、概括、代码生成和信息检索等。 为完成这些任务,LLM 需要基于海量数据进行预训练。在这个过程中,LLM 基于给…

捷达千里江山首发亮相,捷达品牌2024成都车展继续宠粉不停

2024年8月30日,捷达品牌携新车捷达千里江山惊艳亮相2024成都国际车展,并在五周年之际,发布幸福包油计划等宠粉福利,号召用户打卡千里江山,奔赴美好。与此同时,全新捷达VS5/VS7五周年纪念版车型进一步降低了…