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

有效的括号详解 | C语言用动态数组实现栈解决

原题链接:

https://leetcode.cn/problems/valid-parentheses/description/https://leetcode.cn/problems/valid-parentheses/description/

解题思路

这个题目的括号要成功闭合有3个条件:
1.按顺序闭合

2.括号类型正确

2.括号数量正确

第一个按顺序闭合就是,遇到右括号前的最右边的左括号要和该右括号匹配。这一要求使用栈先进后出的特性处理左括号就很方便。遇到左括号压入栈,遇到右括号时出栈,遇到右括号前的最右边的左括号一定在栈顶。

所以要实现一个栈,把遇到左括号就入栈,遇到右括号就和栈顶的括号配对。

下面来实现栈。

使用动态数组实现栈

代码如下:

typedef int STDataType;
typedef struct Stack
{STDataType* data;int capacity;int top;
}ST;
//初始化栈
void STInit(ST* ps)
{//这里先不开辟空间,因栈只有在压栈的时候有扩容assert(ps);ps->data = NULL;//top is the next element of the top of the stackps->top = 0;ps->capacity = 0;
}
//动态开辟,要销毁栈
void STDestory(ST* ps)
{assert(ps);free(ps->data);
}
//压栈
void STPush(ST* ps, STDataType val)
{//因为栈只有这里会用到扩容,所以不需要封装成函数if (ps->top == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : 2* ps->capacity;STDataType* tmp = (STDataType*)realloc(ps->data, sizeof(ST) * newcapacity);if (tmp == NULL){perror("realloc");exit(-1);}ps->data = tmp;ps->capacity += newcapacity;}ps->data[ps->top] = val;ps->top++;
}
//出栈
void STPop(ST* ps)
{assert(ps);assert(ps->top > 0);ps->top--;
}
//获取栈顶元素
STDataType STTop(ST* ps)
{assert(ps);return ps->data[ps->top - 1];
}
//栈为空判断
int STEmpty(ST* ps)
{assert(ps);if (ps->top == 0)return 1;elsereturn 0;
}

运用实现的栈解题

bool isValid(char* s) {//创建一个栈ST sa;//初始化STInit(&sa);while(*s){//左括号入栈if(*s == '(' || *s == '{' || *s == '['){STPush(&sa,*s);// s go ons++;}else{//栈为空//1.整体来说,右括号和左括号的数量不匹配//2.该右括号的左边没有左括号(可能是该右括号是第一个元素,或者左括号已全pop)if(STEmpty(&sa)){STDestory(&sa);return false;}//右括号的类型和左括号不匹配if((*s == '}' && STTop(&sa) != '{')|| (*s == ')' && STTop(&sa) != '(')|| (*s== ']' && STTop(&sa) != '[')){STDestory(&sa);return false;}//右括号和左括号闭合成功else{//pop stack top elementSTPop(&sa);//s go ons++;}}} //左括号的数量闭右括号多,左括号和右括号的数量不匹配   if(!STEmpty(&sa))return false;    STDestory(&sa);return true;
}

其他写法

结尾的返回也可以这么写

判断代码也可以用另一种写法

            if((*s == '}' && STTop(&sa) != '{')|| (*s == ')' && STTop(&sa) != '(')|| (*s== ']' && STTop(&sa) != '[')){STDestory(&sa);return false;}

新写法:

            char topval = STTop(&sa);//右括号的类型和左括号不匹配if((*s == '}' && topval != '{')|| (*s == ')' && topval != '(')|| (*s== ']' && topval != '[')){STDestory(&sa);return false;}

这种写法是空间换时间。

http://www.dtcms.com/a/577724.html

相关文章:

  • 2024年上半年试题一:论大数据lambda架构
  • 北斗GNSS位移监测是什么?主要有哪几种应用?
  • 【芯片设计中的时序约束:Multicycle Path与False Path深度解析】
  • 学院网站建设需求分析调研表wordpress做dropping
  • centos7利docker compose 快速部署 Elasticsearch + Kibana
  • 网站流量建设设计广告设计
  • 个体工商户可以搞网站建设免费人脉推广
  • 谷歌浏览器Google Chrome离线安装包
  • Profinet IO从站数据 转IEC104项目案例
  • 嵌入式学习笔记 - SH79F6441芯片之8051的寻址空间,位寻址与字节地址寻址
  • 项目推荐:BettaFish (微舆) - 当多智能体遇上“论坛”协作机制
  • 跑通Visual-RFT报错解决记录
  • 学习网站二次开发如何自己设置网站
  • 自定义配置打印参数,进行打印功能
  • 免费看电视的网站有哪些深圳响应式网站价格
  • 如何给网站划分栏目利用html5 监控网站性能
  • MySQL原生账号权限管理
  • C#中关于ContextMenuStrip批量添加Item的问题
  • 从线程基础到线程池
  • Android selinux policy单独编译与调试
  • XML介绍
  • 营销推广运营 网站wordpress关闭主循环
  • Linux MTD系统深度解析:从原理到实践
  • css第二天
  • Spring Boot 3.2 高性能架构实战:虚拟线程、原生镜像与响应式编程全解析
  • [vulhub靶机通关]DC-5(文件包含_sreen提权_)
  • 网站建设数据收集方法网站没建好可以备案吗
  • 返利网站开发计划书免费创建社区论坛网站
  • [Avoid-MPC] AvoidanceStateMachine | `Step`心跳函数 | Callback设计
  • Web 前端开发调试实战,从桌面浏览器到真机 WebView 的全链路可视化调试指南