题目来源:力扣

题目描述:

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = "()"
输出:true

示例 2:

输入:s = "()[]{}"
输出:true

示例 3:

输入:s = "(]"
输出:false

提示:

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成

思路:

根据s当前位置字符来判断操作,若s为左括号,入栈,若s为右括号,取栈顶元素并且出栈,然后用栈顶元素和s比较,若匹配,则说明当前括号对应,程序继续执行,否则错误

代码:

typedef int STDataType;typedef struct Stack {STDataType* a;int top;int capacity;
}ST;
void StackInit(ST* ps);//初始化
void StackDestory(ST* ps);//销毁
void StackPush(ST* ps,STDataType x);//入栈
void StackPop(ST* ps);//出栈
STDataType StackTop(ST* ps);//返回栈顶元素
void StackSize(ST* ps);//计算数据个数
bool StackEmpty(ST* ps);//判断是否为空
void StackInit(ST* ps)//初始化
{assert(ps);ps->a = (STDataType*)malloc(sizeof(STDataType) * 4);if (ps->a == NULL) {printf("malloc fail\n");exit(-1);}ps->capacity = 4;ps->top = 0;
}
void StackDestory(ST* ps)//销毁
{assert(ps);free(ps->a);ps->a = NULL;ps->top = ps->capacity = 0;
}
void StackPush(ST* ps, STDataType x)//入栈
{assert(ps);if (ps->top == ps->capacity) {//满了扩容STDataType* tmp= (STDataType*)realloc(ps->a,ps->capacity*2*sizeof(STDataType));if (tmp == NULL) {printf("realloc fail\n");exit(-1);}else {ps->a = tmp;ps->capacity *= 2;}}ps->a[ps->top] = x;ps->top++;
}
void StackPop(ST* ps)//出栈
{assert(ps);assert(ps->top>0);ps->top--;
}
STDataType StackTop(ST* ps)//返回栈顶元素
{assert(ps);assert(ps->top > 0);return ps->a[ps->top - 1];
}
void StackSize(ST* ps)//计算数据个数
{assert(ps);return ps->top;
}
bool StackEmpty(ST* ps)//判断是否为空
{assert(ps);return ps->top == 0;
}
bool isValid(char * s){ST st;char top;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;}top = StackTop(&st);StackPop(&st);if((*s==')' && top != '(') ||(*s==']' && top != '[') ||(*s=='}' && top != '{')){StackDestory(&st);return false;}else{s++;}break;default:break;}}bool ret =StackEmpty(&st);StackDestory(&st);return ret;
}

注意:1.返回之前要释放内存,否则会有内存泄漏情况(这是好的习惯,与题无关)

2.如果只输入左括号,我们就无法取栈顶元素然后比较,所以结尾要加上判空,如果不为空,说明栈内还有左括号,没有匹配完成,返回false

3.如果只输入右括号,会导致程序出错,所以在取栈顶元素前要判断栈是否为空,为空则说明栈内无对应左括号,返回flase

4.使用完一次s后要记得s++

运行结果:

20. 有效的括号-C语言相关推荐

  1. 20小时快速入门go语言视频 - Day1

    20小时快速入门go语言视频 - Day1 一.第一个 Go 程序 1.1 入口 1.2 Golang 保留的关键字 1.3 Golang预定义标识符 二.数据类型 2.1 数据类型的作用 2.2 数 ...

  2. 20小时快速入门go语言视频 - Day5

    笔记声明 本人智商较低,好记性不如烂笔头.笔记记录了网上一套Golang免费视频教程的知识点,以供未来自己翻阅查看.不写源视频的名称和网站地址了,免得被说是广告! 20小时快速入门go语言视频 - D ...

  3. LeetCode19删除链表的倒数第N个节点20有效的括号

    维护不易,还请点赞支持,微信搜索bigsai 回复进群一起打卡. 19删除链表的倒数第N个节点 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1-> ...

  4. LeetCode 20. 有效的括号 golang(三)

    20. 有效的括号 这个题做了三次,前两次的解法现在觉得是算不得正确的. 看的多写得少 做的多总结少 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有 ...

  5. 东北大学c语言及程序设计,东大20秋学期《C语言及程序设计》在线平时作业1参考...

    20秋学期<C语言及程序设计>在线平时作业1( j- V: Z* f0 i+ V& k% b, S. ?/ _8 ~ 1.[单选题] 在C语言中,引用数组元素时,其数组下标的数据类 ...

  6. 【LeetCode】【HOT】20. 有效的括号(栈)

    [LeetCode][HOT]20. 有效的括号 文章目录 [LeetCode][HOT]20. 有效的括号 package hot;import java.util.Deque; import ja ...

  7. Suzy找到实习了吗Day 11 |栈与队列中途 20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值

    Day 11 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值 20. 有效的括号 注意栈不是一个数据结构,需要自己用list实现栈的逻辑 class Solu ...

  8. 算法训练Day11|LeetCode 20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

    题目链接:20. 有效的括号 第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false 第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字 ...

  9. 算法训练第十一天|力扣20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值

    20. 有效的括号 题目链接:有效的括号 参考:https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B ...

最新文章

  1. 做个游戏:设计代码生成特定的调用堆栈
  2. nginx2goaccess.sh脚本内容
  3. 从头开始敲代码之《从BaseApplication/Activity开始(五)》(自定义控件,实现点击/滑动翻页)...
  4. 一文读懂数据库最新技术趋势:TDSQL带你深度纵览VLDB 2019
  5. IT技术人员必须思考的几个问题
  6. java jwt 验证_教程:用Java创建和验证JWT
  7. 07.敏捷项目管理——推测阶段笔记
  8. 【ES6】什么是Promise?解析Promise的基本用法
  9. 2016河北省职称计算机考试试题及答案,2016河北省职称计算机考试操作题答案.doc...
  10. Winform中ComcoBox控件设置选定项
  11. VB语言写CRC16校验
  12. 二次型特征值的猜根法应用
  13. 【Go实战基础】程序里面数据是如何显示到浏览器当中的
  14. 2022牛客寒假算法基础集训营1 H题 牛牛看云
  15. python绘制地图的第三方库,geopandas,用python画地图原来这么简单!
  16. String 类方法及调用案例
  17. spark 3.1.x支持(兼容)hive 1.2.x以及hadoop cdh版本的尝试
  18. chrome linux依赖包,[WebDriver]Linux/Docker下安装Chrome浏览器和ChromeDriver
  19. 宿州市空间数据库管理系统(1)
  20. 上课期间禁止使用手机

热门文章

  1. 上海2013年驾校科目二学习心得,完全是我自己总结的。
  2. python开发微信群_Python编程:微信群聊程序的开发与进/线程知识汇总(附代码)
  3. 【FPGA工程篇】图像采集及显示(一)
  4. 分形之列维(levy)曲线
  5. Command——SQL
  6. Docker多主机管理Docker Machine
  7. 深圳搬家为什么要那么多注意事项
  8. 计算机网络技术店面取名,适合电脑店的名字大全 霸气的电脑店铺起名
  9. Visp系列学习二:visp显示和visp_ros获取图像
  10. 接口测试用例怎么写? 模板示例 2021