文章目录

  • (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语言)| 动图演示,超详细哦~相关推荐

  1. html表格自动变色,如何设置实现Excel单元格自动变色?动图演示更详细

    同事发来了一份Excel表格文件,让你将单元格中的特殊数据进行颜色标注,面对一长串的数据,如果没有快捷技巧,你是否感觉力不从心?今天小编就来支招,给大家介绍一个方法,可以让单元格自动"变色& ...

  2. c 语言从大到小排序算法,10 大经典排序算法(动图演示+ C 语言代码)

    原标题:10 大经典排序算法(动图演示+ C 语言代码) 来源:C语言与CPP编程 以前也零零碎碎发过一些排序算法,但排版都不太好,又重新整理一次,排序算法是数据结构的重要部分,系统地学习很有必要. ...

  3. 【经典排序算法】二分查找法 (动图演示 + C 语言代码实现)

    [经典排序算法]二分查找法 (动图演示 + C 语言代码实现)   

  4. 超详细八大排序+基数排序(图文并茂+动图演示+C语言代码演示)

    超详细八大排序+基数排序(图文并茂+动图演示+C语言代码演示) 插入排序-直接插入排序 插入排序-希尔排序 选择排序-直接选择排序 选择排序-堆排序 交换排序-冒泡排序 交换排序-快速排序-三种方法( ...

  5. IDEA 206个快捷键 动图演示,键盘侠标配

    本文参考了 IntelliJ IDEA 的官网,列举了IntelliJ IDEA(Windows 版)的所有快捷键.并在此基础上,为 90% 以上的快捷键提供了动图演示,能够直观的看到操作效果. 该快 ...

  6. IntelliJ IDEA 206 个快捷键大全,动图演示!搬砖杠杠的!

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜留言必回,有问必答! 每一天进步一点点,是成功的开始... 本文参考了 ...

  7. IntelliJ IDEA快捷键大全 + 动图演示

    来源:blog.csdn.net/weixin_67276852?type=blog 大家好,我是团长~ 本文参考了 IntelliJ IDEA 的官网,列举了IntelliJ IDEA(Window ...

  8. IntelliJ IDEA 2022 最新版 快捷键大全 GIF 动图演示

    IntelliJ IDEA 2022 最新版 快捷键大全 GIF 动图演示 本文参考了 IntelliJ IDEA 的官网,列举了IntelliJ IDEA(Windows 版)的所有快捷键.并在此基 ...

  9. IDEA快捷键大全 + 动图演示,效率真高

    本文参考了 IntelliJ IDEA 的官网,列举了IntelliJ IDEA(Windows 版)的所有快捷键.并在此基础上,为 90% 以上的快捷键提供了动图演示,能够直观的看到操作效果. 官网 ...

  10. IntelliJ IDEA快捷键大全 + 动图演示,建议收藏!

    点击关注公众号,利用碎片时间学习 本文参考了 IntelliJ IDEA 的官网,列举了IntelliJ IDEA(Windows 版)的所有快捷键.并在此基础上,为 90% 以上的快捷键提供了动图演 ...

最新文章

  1. 网络的塔建+模型训练
  2. 计算机视觉--优秀开源方案集锦
  3. 启动php-fpm服务器_无服务器冷启动不是问题-这就是为什么(对于大多数应用程序)...
  4. MTK 驱动开发(31)---Sensor 移植及调试1
  5. Spring Boot使用自定义的properties
  6. dbscan算法中 参数的意义_常用聚类算法
  7. linux字符界面播放vcd,在Linux中制作VCD
  8. 宝塔控制面板如何添加伪静态
  9. Http实战之Wireshark抓包分析
  10. C语言常用库函数(含详细用法)
  11. axure不显示元件库
  12. 【SAP】实施方法论-ASAP
  13. linux下ASM配置
  14. 浅谈HTML页面基本结构
  15. java 水晶按钮_java渲染水晶按钮
  16. 虚拟机挂载ISO文件
  17. Mac:VSCode 批量替换快捷键
  18. ThreeJS-太阳球围绕旋转(二十四)
  19. PAT basic level 答案+解题思路+难点 (个人刷题记录)
  20. Flink获取外部传递参数的两种方式

热门文章

  1. aspose合并单元格
  2. AS连接MUMU模拟器
  3. anaconda清华镜像源使用
  4. 那些测绘工作中让你事半功倍的小工具软件,我不推荐你轻易安装
  5. Python 中文数字对照表 输入一个数字,转换成中文数字
  6. 5、DOC命令获取连接电脑热点的设备的mac、ip
  7. 2016中期中国云计算市场报告
  8. PCB原理图制作一些简单个人总结
  9. Android 稳定性面试一文通
  10. Ubuntu18.04下,QT5移植到ARM板上运行程序发生异常:could not find or load the Qt platform plugin linuxfb原因