当前位置: 首页 > news >正文

【LeetCode】数据结构题解(10)[有效的括号]

有效的括号

  • 😉 1.题目来源
  • 👀2.题目描述
  • 🤔3.解题思路
  • 🥳4.代码展示

在这里插入图片描述

😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘
所属专栏:玩转数据结构题型❤️
🚀 >博主首页:初阳785❤️
🚀 >代码托管:chuyang785❤️
🚀 >感谢大家的支持,您的点赞和关注是对我最大的支持!!!❤️
🚀 >博主也会更加的努力,创作出更优质的博文!!❤️
🚀 >关注我,关注我,关注我,重要的事情说三遍!!!!!!!!❤️
😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘

😉 1.题目来源

LeetCode有效的括号
🚨注意:本题涉及到有关数据结构——栈,这一章节的知识点,如有小伙伴还不熟栈的,可以先复习复习一下有关栈的相关知识,复习的地方我也提供了哦🙂,所用到的知识点——栈
🚨注意:同样的本题是使用纯C语言实现的.

👀2.题目描述

给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
1.左括号必须用相同类型的右括号闭合。
2.左括号必须以正确的顺序闭合。
3.每个右括号都有一个对应的相同类型的左括号。

在这里插入图片描述
🚨🚨🚨🚨🚨🚨🚨🚨🚨

  • 🚨注意:像一下的测试用例也是返回false的哦
    💡: 输入: “( { ) }”;
    💡: 输出:false
    虽然这个有匹配的括号,但是这个是不行的,要满足,匹配一对括号后并拿掉这块括号后,后面的括号还能匹配才行.

  • 💡: 输入: “[ ( { } ) ]”
    💡: 输出:true
    这个便可以.

🤔3.解题思路

  • 🤔当看到这个题目的时候,我们一开始的想法肯定是,通过一个数组把所有的括号存起来,在对数组遍历,通过判断是左括号来给其遍历找到右括号,直到所有括号都匹配完比,如果是这样的话,空间复杂度是O(1),时间复杂度是O(n^2),这样看起来是可以的🤔实则是一个错误的思路,因为我们遍历的时候,虽然所有的括号都匹配成功了,但是😱可能括号的顺序是错误的,就比如:"( { ) }" 或者再如"} { ] [ ) ("这些虽然遍历结束后,得到的都是所有括号都可以匹配成功,但是😮他们顺序是错误的,故返回false
  • 既然匹配成功的同时还要求要顺序不能乱我们就想到了,栈的特殊特点(先进的后出),于是我们就遍历数组,如果遇到的是左括号,我们就入栈,如果遇到的是右括号,我们就出栈匹配,这样根据栈的特性,就很好解决了括号的顺序问题.

💡例一:
在这里插入图片描述
💡例二:
在这里插入图片描述

🚨🚨🚨🚨🚨🚨🚨🚨🚨
🚨注意: 除了上面的情况之外,还可能遇到两种情况

  • 💡1.右括号多了
    如果是左括号多了的话,栈中有又没有括号了,直接返回false

  • 💡2.左括号多了
    如果是右括号多了,就是栈中还有括号,二数组中没有与之匹配的括号了,同样返回false

🥳4.代码展示


//调用栈接口
typedef char STDataType;
typedef struct Stack
{STDataType* data;int capaciyt;int size;
}Stack;void StackInit(Stack* ps);void StackDestroy(Stack* ps);void StackPush(Stack* ps, STDataType x);void StackPop(Stack* ps);STDataType StackTop(Stack* ps);bool StackEmpt(Stack* ps);int StackSize(Stack* ps);void StackInit(Stack* ps)
{assert(ps);ps->data = NULL;ps->capaciyt = 0;ps->size = 0;
}void StackDestroy(Stack* ps)
{assert(ps);free(ps->data);ps->data = NULL;ps->capaciyt = ps->size = 0;
}void StackPush(Stack* ps, STDataType x)
{assert(ps);if (ps->size == ps->capaciyt){int newCapacity = ps->capaciyt == 0 ? 4 : ps->capaciyt * 2;STDataType* tmp = (STDataType*)realloc(ps->data, sizeof(STDataType) * newCapacity);if (tmp == NULL){perror("realloc");exit(-1);}ps->data = tmp;ps->capaciyt = newCapacity;}ps->data[ps->size] = x;ps->size++;
}void StackPop(Stack* ps)
{assert(ps);assert(!StackEmpt(ps));ps->size--;
}STDataType StackTop(Stack* ps)
{assert(ps);assert(!StackEmpt(ps));return ps->data[ps->size - 1];
}bool StackEmpt(Stack* ps)
{assert(ps);return ps->size == 0;
}int StackSize(Stack* ps)
{assert(ps);return ps->size;
}//函数实现
bool isValid(char * s)
{Stack st;//记得初始化StackInit(&st);while (*s){//如果是左括号就入栈if (*s == '[' || *s == '(' || *s == '{'){StackPush(&st,*s);}//如果是右括号,就出栈对比else{//如果是左括号更多,栈内数据为空,直接返回falseif (StackEmpt(&st)){StackDestroy(&st);return false;}char ch = StackTop(&st);StackPop(&st);if ((*s == ']' && ch != '[') || (*s == ')' && ch != '(') || (*s == '}' && ch != '{')){StackDestroy(&st);return false;}}s++;}//如果是右括号更多,栈中数据不为空,同样返回falsebool ret = StackEmpt(&st);StackDestroy(&st);return ret;
}
http://www.lryc.cn/news/115402.html

相关文章:

  • 5G用户逼近7亿,5G发展迈入下半场!
  • 分布式问题
  • 教雅川学缠论06-中枢
  • 如何调教让chatgpt读取自己的数据文件(保姆级图文教程)
  • React Native Camera的使用
  • 【Matlab】Elman神经网络遗传算法(Elman-GA)函数极值寻优——非线性函数求极值
  • @ControllerAdvice注解使用及原理探究 | 京东物流技术团队
  • Error: Design has unresolved cell reference
  • uni-app 封装api请求
  • SpringCloud实用篇1——eureka注册中心 Ribbon负载均衡原理 nacos注册中心
  • 【MySQL】sql字段约束
  • 森海塞尔为 CUPRA 首款纯电轿跑 SUV – CUPRA Tavascan 注入音频魅力
  • Java、Android 加解密、编码、压缩、解压缩、Hash
  • 11_Pulsar Adaptors适配器、kafka适配器、Spark适配器
  • jupyter文档转换成markdown
  • 日志框架及其使用方法
  • ZIG:理解未来编程语言的视角
  • 让三驾马车奔腾:华为如何推动空间智能化发展?
  • 2022年03月 Python(一级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • WIN大恒工业相机SDK开发
  • qt qml中各种Layout之间是如何对齐的?
  • Immutable.js 进行js的复制
  • java动态生成excel并且需要合并单元格
  • JMeter启动时常见的错误
  • python pandas 排序
  • 前后端分离式项目架构流程复盘之宿舍管理系统
  • Linux nohup 命令详解
  • VoxWeekly|The Sandbox 生态周报|20230731
  • 编程导航算法村第九关 | 二分查找
  • linux 下安装部署flask项目