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

力扣刷题 -- 20.有效的括号

1. 题目

2. 思路分析 

第一步:先看题目理解大意。题目中说左括号必须遇到对应的右括号匹配且闭合顺序必须正确。即()配对,{ }配对,[ ]配对。

第二步:观察示例,我们可以发现示例三是回文结构,示例四又是对称结构,看到这里还是没有思路。再想想

第三步:既然左括号要遇到右括号才能进行匹配,那如果我遍历字符串:遇到左括号就入栈,遇到右括号我就将左括号拿出来进行匹配!欸,这个思路好像可以!

到这里其实你的思路就基本正确了:

正确的思路如下: 

遍历字符串,遇到左括号就入栈,当遇到右括号时:取栈顶元素进行匹配,匹配就出栈。如果遍历完后,如果栈为空则字符串有效;否则无效!!

注意:有几种特殊情况我们需要考虑到:

3. 实现代码 

typedef char STDataType;
typedef struct Stack
{STDataType* arr;int top;//栈顶(相当于size)int capacity;//栈的大小
}ST;
//初始化
void StackInit(ST* ps)
{ps->arr = NULL;ps->top = ps->capacity = 0;
}
//销毁
void StackDestroy(ST* ps)
{assert(ps);if (ps->arr != NULL){free(ps->arr);ps->arr = NULL;ps->capacity = ps->top = 0;}
}
//入栈
void StackPush(ST* ps, STDataType x)
{assert(ps);//入栈的前提:要有足够大的空间if (ps->top == ps->capacity)//空间不够{int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;STDataType* temp = realloc(ps->arr, newcapacity * sizeof(STDataType));if (temp == NULL){perror("realloc fail!");exit(1);}else//扩容成功{ps->arr = temp;ps->capacity = newcapacity;}}//空间够了,进行入栈ps->arr[ps->top] = x;ps->top++;
}
//判断栈顶为空
bool StackEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}
//出栈
void StackPop(ST* ps)
{assert(ps);if (!StackEmpty(ps)){ps->top--;}
}//获取栈顶元素
STDataType Stacktop(ST* ps)
{assert(ps);return ps->arr[ps->top-1];
}
//获取栈顶元素有效个数
int StackSize(ST* ps)
{assert(ps);return ps->top;
}
/栈的结构和相关方法///
bool isValid(char* s) {STDataType* pi=s;ST pq;while(*pi!='\0'){//遍历字符串,碰到左括号进行入栈if(*pi=='('||*pi=='{'||*pi=='['){StackPush(&pq,*pi);//入栈pi++;}//遇到右括号else{//先判断栈是否为空if(StackEmpty(&pq)){return false;}else{//取栈顶元素,看是否匹配int top = Stacktop(&pq);if(*pi==')'&&top!='('||*pi==']'&&top!='['||*pi=='}'&&top!='{'){return false;}//匹配else{StackPop(&pq);//出栈pi++;}}}}if(StackEmpty(&pq)){return true;}else{return false;}
}
http://www.xdnf.cn/news/9745.html

相关文章:

  • NR[ RF - 简介 ]
  • Docker Desktop无法在windows低版本进行安装
  • Qt 的简单示例 -- 地址簿
  • XCTF-web-fileinclude
  • maven离线将jar包导入到本地仓库中
  • 【大模型原理与技术-毛玉仁】第一章 语言模型基础
  • STM32F103_Bootloader程序开发04 - App跳转模块(app_jump.c与app_jump.h)
  • 使用 Unsloth 快速微调 LLMs 实用指南
  • CentOS7安装WVP+ZLM
  • 设置随机数种子的作用
  • 智慧康养实训室建设方案:基于“互联网 + 康养”的实训设计​
  • 【IEEE出版| 高届数EI会议】第十届计算机与信息处理技术国际学术研讨会(ISCIPT 2025)
  • 高并发订单服务库存超卖解决方案
  • 题目 3342: 蓝桥杯2025年第十六届省赛真题-红黑树
  • 电动黄油枪行业数据分析报告2025-恒州诚思
  • JavaWeb:NodeJS安装及环境配置
  • python的server启动项目和nginx有什么区别?
  • 多模态简介
  • 湖北理元理律师事务所:从法律合规到心灵契合的服务升维
  • SpringBoot自定义实体类字段的校验注解
  • SQL输出20个9
  • 商旅平台排名:十大商旅服务平台解析
  • YOLO-UniOW概述 论文
  • Docker 前端镜像容器部署指南
  • 创建型设计模式之Prototype(原型)
  • c/c++的opencv图像金字塔缩放
  • 【代码训练营Day01】数组part1
  • Linux进程间通信----管道
  • 人员睡岗检测算法AI智能分析网关V4打造工业/安防/交通等多场景应用方案
  • VMware安装Ubuntu实战分享大纲