数据结构——括号匹配问题

news2024/11/25 16:53:20

这是一道常见的经典的数据结构中栈的问题。

题目:

20. 有效的括号 - 力扣(LeetCode)

我们运用C语言实现这个问题。

有效括号

调用栈

由于要涉及到栈的问题,不可避免的要运用栈的函数接口。比较直接的方法是,直接复制 栈 的代码,直接拿来用就行了。这里要注意,我们要把原来的“int”改成“char”。

//动态
typedef char STDataType;

typedef struct Stack
{
    //数据类型
    STDataType* a;
    //栈顶
    int top;
    //扩容
    int capacity;
}Stack;

//初始化
void StackInit(Stack* ps);
//释放空间
void StackDestory(Stack* ps);
//添加数据——入栈
void StackPush(Stack* ps, STDataType x);
//删除数据——出栈 
void StackPop(Stack* ps);
//取栈里的数据
STDataType StackTop(Stack* ps);
//数据个数
int StackSize(Stack* ps);
//判空
bool StackEmpty(Stack* ps); 

//初始化
void StackInit(Stack* ps)
{
    //判空
    assert(ps);
    //扩容
    ps->a = (STDataType*)malloc(sizeof(STDataType) * 4);
    //扩容失败
    if (ps->a == NULL)
    {
        perror("ps->a:");
        //终止
        exit(-1);
    }
    ps->capacity = 4;
    //插入数据top++
    ps->top = 0;
}

//释放空间
void StackDestory(Stack* ps)
{
    //判空
    assert(ps);
    free(ps->a);
    ps->a = NULL;
    ps->capacity = 0;
    ps->top = 0;
}

//添加数据
void StackPush(Stack* ps, STDataType x)
{
    //判空
    assert(ps);

    //判断是否要扩容
    if (ps->top == ps->capacity)
    {
        STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(ps->a) * 2 * (ps->capacity));
        if (tmp == NULL)
        {
            perror("realloc:");
            //终止
            exit(-1);
        }
        else
        {
            ps->a = tmp;
            ps->capacity *= 2;
        }
    }
    //加数据
    ps->a[ps->top] = x;
    //注意顺序
    ps->top++;
}

//删除数据
void StackPop(Stack* ps)
{
    //判空
    assert(ps);
    //不能为负数
    assert(ps->top > 0);

    ps->top--;
}


//取栈里的数据
STDataType StackTop(Stack* ps)
{
    //判空
    assert(ps);
    //不能为负数
    assert(ps->top > 0);
    
    return ps->a[ps->top - 1];
}

//数据个数
int StackSize(Stack* ps)
{
    //判空
    assert(ps);
    
    return ps->top;
}

//判空
bool StackEmpty(Stack* ps)
{
    //判空
    assert(ps);

    return ps->top == 0;
}

实现接口

其实这跟我们写的那些接口一样,第一步还是初始化

ST st;
StackInit(&st);

我们用学习C语言的时候的语法中的switch语句解决就行了。

这里一定要注意:我在这里找错误找了一个多小时,才找到,case选择时,一定要把左括号放在前面,右括号放在后面,因为题中的测试例子都是先左后右的。

首先while循环,为‘0’的时候就停下来。我们再来思考一下,左括号我们放数据,是不是直接调用Stackpush,然后s++,就行了。然后右括号提取之前我们应该先存放左括号的值,然后与左括号相比较,失败就直接返回false,成功就继续,s++,然后可能会遇到为空的情况,为空直接返回false。

结尾我们再判断是不是为0,0就是false,非0就是ture。

bool isValid(const char* s)
{
    //初始化
    Stack st;
    StackInit(&st);
    while (*s != '\0')
    {
        switch (*s)
        {
        case '(':
        case '{':
        case '[':
        {
            //添加数据
            StackPush(&st, *s);
            s++;
            break;
        }
        case ')':
        case '}':
        case ']':
        {
            //判空
            if (StackEmpty(&st))
            {
                StackDestory(&st);
                return false;
            }
            //存前一个的数据
            STDataType top = StackTop(&st);
            StackPop(&st);
            //匹配失败
            if ((*s == '(' && top != ')')
                || (*s == '[' && top != ']')
                || (*s == '{' && top != '}'))
            {
                StackDestory(&st);
                return false;
            }
            else
            {
                s++;
            }
            break;
     
        }
        }
    }
    bool ret = StackEmpty(&st);
    StackDestory(&st);
    return ret;
}

然后提交

这个题目就写出来了。

修改

我么你还可以试着简单修饰一下。

我们再把计数接口给删除,一下子内存消耗就大大减小了。

欢迎大家留言和点赞哦!

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

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

相关文章

通过windows程序计划设定nginx开机自启动

通过windows程序计划设定nginx开机自启动1、按下win键输入计划,回车2、找到windows目录,在当下目录创建新任务3、自定义名称描述4、将触发设定为开机自启动5.点击下一步,程序或脚本选择nginx.exe所在目录,要把下面的起始于 处填上…

算法训练营 day20 二叉树 最大二叉树 合并二叉树 二叉搜索树中的搜索 验证二叉树

算法训练营 day20 二叉树 最大二叉树 合并二叉树 二叉搜索树中的搜索 验证二叉树 最大二叉树 654. 最大二叉树 - 力扣(LeetCode) 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值…

《Linux Shell脚本攻略》学习笔记-第十一章

11.1 简介 本章将会讲述如何获取相关网络分组。CPU占用率、磁盘使用情况以及东台调用的更多信息。 11.2 使用tcpdump跟踪分组 tcpdump需要以root身份运行。 关键字port可以只显示出发往或者来自特定端口的分组 src修饰符配合特定的“关键字-值”就可以指定源文件中的这类分组。…

Linux chown 命令

Linux chown(英文全拼:change owner)命令用于设置文件所有者和文件关联组的命令。Linux/Unix 是多人多工操作系统,所有的文件皆有拥有者。利用 chown 将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户 …

基于机器学习 实现APT 检测(附完整代码)

项目环境概述以机器学习的方式,可以通过多种模型对 APT 组织所使用的恶意代码进行训练学习,同时由于训练的多样化,检测效果也会比家好。本项目采用的随机森林以及不同采样策略进行模型训练。详细设计见md文件。1.系统描述本系统主要是针对大量…

ElementUI中树形表格下拉卡死的问题解决

文章目录错误现象与描述:代码案例:错误现象与描述: 最近在修改一个前端的问题,发现后台返回给前端有数据,SQL查询也很快,但是就是前端的表格这里一直卡死,后来发现其他数据正常,其中…

【代码随想录】343. 整数拆分

343. 整数拆分 动态规划五部曲 1. 确定dp数组以及下标的含义 dp[i]:分拆数字i,可以得到的最大乘积为dp[i]。 2. 确定递推公式 其实可以从1遍历j,然后有两种渠道得到dp[i]. 一个是j * (i - j) 直接相乘。 一个是j * dp[i - j],相…

文本向量化

1、one-hot 在one-hot里面每一个token用一个长度为N向量表示,N表示的是词典的数据量。(不重复的词数量) 缺点:维度太高,用稀疏向量表示文本。 2、word embedding 使用float的矩阵来表示token,根据词典的…

Qt环境生成dump文件解决程序异常崩溃以及生成日志文件

一、背景 1、在测试自己的项目代码过程 ① 程序的编译的时候没有报错,程序在Qt release模式下运行程序,程序运行五个小时后异常退出,The process was ended forcefully;② 以及在项目程序通过windeployqt 工具打包发布的程序&am…

用最简单的方式告诉你什么是集线器、交换机、路由器

欢迎来到东用知识小课堂!某一天,你到你女友小芳(暂定这个名字吧)就读的学校去找她,那么你的做法是什么呢:一、集线器的工作方式:你站到学校中庭,大喊一声“小芳,我来你找你了!”(广播)如果这个时…

〖百宝书-思维锻炼①〗——思维进阶和升华

大家好,我是涵子,欢迎大家今天进入了新专题:百宝书-思维锻炼! 💬 人生格言:Stay foolish, stay kind.💬 📫 如果文章知识点有错误的地方,请指正!和大家一起学…

SpringSecurity随笔(2)-OAuth2协议

短信登录 参考密码登录过程 1.编写短信登录过滤器,验证短信验证码 2.编写未认证得SmsAuthenticationToken 3.将未认证的SmsAuthenticationToken传递给AuthenticationManager 4.编写一个SmsAuthenticationProvider 5.调用UserDetialsService获取用户信息 OAuth协议…

【Linux杂篇】经常登录Linux,用户密码背后的知识了解一下

一,用户密码存放在哪里? 说到这个问题,绝大部分的同学肯定都知道/etc/passwd这个文件,不错,这个文件里存储的就是用户名,密码等信息。 每一行都是一个account,每一行有7个信息,分…

在农业银行做开发是什么样的体验?

本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~ Github地址:https://github.com/…

MySQL环境搭建

文章目录1. MySQL的卸载步骤1:停止MySQL服务步骤2:软件卸载步骤3:残余文件的清理步骤4:清理注册表步骤5:删除环境变量配置2. MySQL的下载、安装、配置MySQL的4大版本软件的下载MySQL8.0 版本的安装配置MySQL8.0配置MyS…

超详解通讯录,保姆式教学 ,轻松学会实现通讯录的功能【c语言】

文章目录静态通讯录Contact.htest.c菜单的创建Contact.c初始化通讯录InitContact的实现增加联系人AddContact的实现查找指定联系人的信息SearchContact的实现删除指定联系人DelContact的实现修改指定联系人的信息ModifyContact的实现显示所有联系人的信息ShowContact的实现完整…

vite项目为什么可以直接使用NODE_ENV?

背景 我们知道,在process.env中并没有NODE_ENV这个变量,但是我们却可以在项目的代码中使用process.env.NODE_ENV这个值来判断当前是development环境还是production环境,然后进行后续的逻辑操作。 这说明,在vite内部,…

大数据面试题集锦-Hadoop面试题(二)-HDFS

你准备好面试了吗?这里有一些面试中可能会问到的问题以及相对应的答案。如果你需要更多的面试经验和面试题,关注一下"张飞的猪大数据分享"吧,公众号会不定时的分享相关的知识和资料。 1、 HDFS 中的 block 默认保存几份? 默认保存…

MacBook Pro外接显示器竖屏显示

📢📢📢📣📣📣哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步🤝🤝一位上进心十足的【Java ToB端大厂领…

接口性能测试避坑 Django+Nginx+uwsgi接口性能调优postman Apifox ab

Django开发了个接口供外部调用,Django的并发性能弱早有所闻,所以采用DjangoNginxuwsgi架构来提高并发量。然后使用测试工具测试并发量。服务器配置:CPU 2,内存8G接口内容只有3句:request_data {"code":&quo…