【LeetCode】括号匹配问题(C语言)| 动图演示,超详细哦~
文章目录
- (1)题目描述
- (2)解题思路
(1)题目描述
给定一个只包括
'('
,')'
,'{'
,'}'
,'['
,']'
的字符串s
,判断字符串是否有效。有效字符串需满足:
1、左括号必须用相同类型的右括号闭合。
2、左括号必须以正确的顺序闭合。
示例1:
输入:s = “( )”
输出:true
示例2:
输入:s = “( ) [ ] { }”
输出:true
示例3:
输入:s = “( ]”
输出:false
示例4:
输入:s = “( [ ) ]”
输出:false
示例5:
输入:s = “{ [ ] }”
输出:true
(2)解题思路
利用栈的性质解决此题
首先实现一个栈
然后遍历字符串,如果遇到左括号(
'('
,'{'
,'['
),将其压入栈中,如果遇到右括号(')'
,'}'
,']'
),将当前栈顶的左括号出栈,与其匹配,看是否是一对,若匹配失败,则返回false,匹配成功,则继续遍历字符串后面的字符。两种特殊情况:
(1)字符串中全是左括号,全部入栈了,遍历结束后,需要对栈判空一下,若不为空,返回false
(2)字符串中全是右括号,没有左括号则栈为空,所以在遍历字符串遇到右括号时需要判断一下当前栈是否为空,若为空,返回false
图解算法(示例2):
- 图解算法(示例5):
- 代码如下
首先实现一个栈:
//定义可以动态增长的栈
typedef struct Stack
{char* a;int top;int capacity;
}Stack;
//初始化栈
void StackInit(Stack *ps)
{assert(ps);ps->a = NULL;ps->top = -1;ps->capacity = 0;
}
//销毁栈
void StackDestroy(Stack *ps)
{assert(ps);if(ps->a){free(ps->a);}ps->a = NULL;ps->top = -1;ps->capacity = 0;
}
//入栈
void StackPush(Stack *ps, char x)
{assert(ps);if(ps->top == ps->capacity - 1) //检查栈的容量是否已满{//扩容int newcapacity = (ps->capacity == 0) ? 4 : 2 * (ps->capacity);char* temp = realloc(ps->a, newcapacity * sizeof(char));if(temp == NULL){perror("realloc");exit(-1);}ps->a = temp;ps->capacity = newcapacity; //更新容量}ps->top++;ps->a[ps->top] = x;
}
//出栈
void StackPop(Stack *ps)
{assert(ps);assert(ps->top != -1); //栈不能为空ps->top--;
}
//获取栈顶元素
char StackTop(Stack *ps)
{assert(ps);return ps->a[ps->top];
}
//检查栈是否为空
bool StackEmpty(Stack *ps)
{assert(ps);return ps->top == -1;
}
核心代码:
bool isValid(char *s){Stack s1;StackInit(&s1);while(*s){if(*s == '(' || *s == '[' || *s == '{') //当前字符为左括号{StackPush(&s1, *s); //入栈}else //当前字符为右括号{if(StackEmpty(&s1)) //如果栈为空,说明没有左括号,则返回false{return false;}char ch = StackTop(&s1); //获取栈顶元素StackPop(&s1); //栈顶元素出栈if((*s == ')' && ch != '(') //当前字符与栈顶元素未匹配成功,返回false|| (*s == ']' && ch != '[')|| (*s == '}' && ch != '{')){return false;}}s++;}//有可能字符串中全是左括号,全部入栈了,所以需要判空一下,若不为空返回falsereturn StackEmpty(&s1); //检测栈是否为空
}
上面核心代码,有一个小小的问题,没有销毁栈,可能会造成内存泄漏。
我们来改进一下:用一个布尔变量 match 来记录下返回值 true / false,最后先销毁栈,再返回值。
bool isValid(char *s){Stack s1;StackInit(&s1);bool match = true; //记录函数返回值while(*s){if(*s == '(' || *s == '[' || *s == '{') //当前字符为左括号{StackPush(&s1, *s); //入栈}else //当前字符为右括号{if(StackEmpty(&s1)) //如果栈为空,说明没有左括号,则返回false{match = false;break;}char ch = StackTop(&s1); //获取栈顶元素StackPop(&s1); //栈顶元素出栈if((*s == ')' && ch != '(') //当前字符与栈顶元素未匹配成功,返回false|| (*s == ']' && ch != '[')|| (*s == '}' && ch != '{')){match = false;break;}}s++;}//match为true,有可能因为字符串中全是左括号,全部入栈了,所以需要判空一下,若不为空返回falseif(match == true){match = StackEmpty(&s1);}StackDestroy(&s1); //销毁栈return match;
}
大家快去动手练习一下吧!
【LeetCode】括号匹配问题(C语言)| 动图演示,超详细哦~相关推荐
- html表格自动变色,如何设置实现Excel单元格自动变色?动图演示更详细
同事发来了一份Excel表格文件,让你将单元格中的特殊数据进行颜色标注,面对一长串的数据,如果没有快捷技巧,你是否感觉力不从心?今天小编就来支招,给大家介绍一个方法,可以让单元格自动"变色& ...
- c 语言从大到小排序算法,10 大经典排序算法(动图演示+ C 语言代码)
原标题:10 大经典排序算法(动图演示+ C 语言代码) 来源:C语言与CPP编程 以前也零零碎碎发过一些排序算法,但排版都不太好,又重新整理一次,排序算法是数据结构的重要部分,系统地学习很有必要. ...
- 【经典排序算法】二分查找法 (动图演示 + C 语言代码实现)
[经典排序算法]二分查找法 (动图演示 + C 语言代码实现)
- 超详细八大排序+基数排序(图文并茂+动图演示+C语言代码演示)
超详细八大排序+基数排序(图文并茂+动图演示+C语言代码演示) 插入排序-直接插入排序 插入排序-希尔排序 选择排序-直接选择排序 选择排序-堆排序 交换排序-冒泡排序 交换排序-快速排序-三种方法( ...
- IDEA 206个快捷键 动图演示,键盘侠标配
本文参考了 IntelliJ IDEA 的官网,列举了IntelliJ IDEA(Windows 版)的所有快捷键.并在此基础上,为 90% 以上的快捷键提供了动图演示,能够直观的看到操作效果. 该快 ...
- IntelliJ IDEA 206 个快捷键大全,动图演示!搬砖杠杠的!
点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜留言必回,有问必答! 每一天进步一点点,是成功的开始... 本文参考了 ...
- IntelliJ IDEA快捷键大全 + 动图演示
来源:blog.csdn.net/weixin_67276852?type=blog 大家好,我是团长~ 本文参考了 IntelliJ IDEA 的官网,列举了IntelliJ IDEA(Window ...
- IntelliJ IDEA 2022 最新版 快捷键大全 GIF 动图演示
IntelliJ IDEA 2022 最新版 快捷键大全 GIF 动图演示 本文参考了 IntelliJ IDEA 的官网,列举了IntelliJ IDEA(Windows 版)的所有快捷键.并在此基 ...
- IDEA快捷键大全 + 动图演示,效率真高
本文参考了 IntelliJ IDEA 的官网,列举了IntelliJ IDEA(Windows 版)的所有快捷键.并在此基础上,为 90% 以上的快捷键提供了动图演示,能够直观的看到操作效果. 官网 ...
- IntelliJ IDEA快捷键大全 + 动图演示,建议收藏!
点击关注公众号,利用碎片时间学习 本文参考了 IntelliJ IDEA 的官网,列举了IntelliJ IDEA(Windows 版)的所有快捷键.并在此基础上,为 90% 以上的快捷键提供了动图演 ...
最新文章
- 网络的塔建+模型训练
- 计算机视觉--优秀开源方案集锦
- 启动php-fpm服务器_无服务器冷启动不是问题-这就是为什么(对于大多数应用程序)...
- MTK 驱动开发(31)---Sensor 移植及调试1
- Spring Boot使用自定义的properties
- dbscan算法中 参数的意义_常用聚类算法
- linux字符界面播放vcd,在Linux中制作VCD
- 宝塔控制面板如何添加伪静态
- Http实战之Wireshark抓包分析
- C语言常用库函数(含详细用法)
- axure不显示元件库
- 【SAP】实施方法论-ASAP
- linux下ASM配置
- 浅谈HTML页面基本结构
- java 水晶按钮_java渲染水晶按钮
- 虚拟机挂载ISO文件
- Mac:VSCode 批量替换快捷键
- ThreeJS-太阳球围绕旋转(二十四)
- PAT basic level 答案+解题思路+难点 (个人刷题记录)
- Flink获取外部传递参数的两种方式