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

有效的括号数据结构oj题(力口20)

目录

目录

题目描述

题目分析解析

解决代码

写题感悟:


题目描述

还有实例

题目分析解析

对于这个题目,我们首先有效字符串需要满足什么,第一个左右括号使用相同类型的括号,这好理解,无非就是小括号和小括号大括号和大括号一起匹配。其次第二个就是左括号必须以正确顺序来匹配注意了是顺序,大家以为就是左括号(小括号)遇到左括号(中括号)然后遇到了右括号(小括号)和右括号(中括号),然而恰恰相反,而是小括号(左)、中括号(右)和中括号(右)小括号(右)相依匹配大致就是遇到第一个右括号时,然后与自己最近的左括号进行匹配,假设匹配成功消除,第二个右括号继续匹配最近的括号)。最后就是第三个和我们将的第一个差不多,就是和对应的左括号匹配,但是这里主要是限制只有右括号的情况

接下来就是如何解决问题了。

这里我们根据第二个要求,可以知道当遇到右括号时,需要找到与之最近的左括号匹配,通过这个我们就能想到,当遇到右括号时把后进的左括号与之对比看是否满足相同类型括号。这个后进先出就和我们学过的数据结构栈有关系,所以我们这里需要数据结构栈来写。将遇到的左括号存入栈中,直到遇到右括号(这里还得考虑是否右括号),判断是否匹配成功,只要有一个匹配失败,就说明这个字符串不符合有效字符,以上都符合后,最后判断栈是否还有左括号,如果没有则符号题目要求。

解决代码

//栈结构
typedef char STDataType;
typedef struct Stack
{STDataType* arr;int top;int capacity;
}ST;
//初始化
void StackInit(ST* Stack)
{Stack->arr = NULL;Stack->capacity = Stack->top = 0;
}//入栈
void StackPush(ST* Stack, STDataType x)
{assert(Stack);//空间不够if (Stack->capacity == Stack->top){//扩容int newcapacity = Stack->capacity == 0 ? 4 : 2 * Stack->capacity;STDataType* tmp = (STDataType*)realloc(Stack->arr, newcapacity * sizeof(STDataType));if (tmp == NULL){perror("realloc");exit(1);}Stack->arr = tmp;Stack->capacity = newcapacity;}//空间够Stack->arr[Stack->top++] = x;
}//判断
bool StackEmpty(ST* Stack)
{assert(Stack);return Stack->arr==NULL;
}//出栈
void StackPop(ST* Stack)
{assert(!StackEmpty(Stack));--Stack->top;
}//获取栈中元素
STDataType StackTop(ST* Stack)
{assert(!StackEmpty(Stack));return Stack->arr[Stack->top - 1];
}//获取栈中元素个数
int StackSize(ST* Stack)
{assert(!StackEmpty(Stack));return Stack->top;
}//销毁栈
void StackDestory(ST* Stack)
{if (Stack->arr)free(Stack->arr);Stack->arr = NULL;Stack->capacity = Stack->top = 0;
}bool isValid(char* s) {ST st;
StackInit(&st);
char* cur = s;
while (*cur != '\0')
{//遇到左括号存入栈if (*cur == '('|| *cur == '['|| *cur == '{'){StackPush(&st, *cur);}//遇到右括号取栈顶元素进行对比else{//内部栈为空时(只有右括号时)if(st.top == 0){return false; }char top = StackTop(&st);if (*cur == ')' && top != '('|| *cur == ']' && top != '['|| *cur == '}' && top != '{'){StackDestory(&st);return false;}StackPop(&st);}cur++;
}
if (!StackSize(&st))
{return true;
}
else
{return false;
}
}

写题感悟

        这道题对于初学者的我很难想到尽然会用到数据结构栈,这说明数据结构在刷题过程中发挥着不可磨灭的作用。因此我觉得思路和知识都很重要,当然知识是的重要占大头,没有知识就没有这个思路,就算给你一个思路,也很难实现。我觉得在前期的刷题过程需要刻意取练习,到后面就需要综合去刷,利用自己学到的知识去解决问题,这个题目告诉我如果遇到先进后出或者后进需要先出类似的题目,首先可以考虑栈。

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

相关文章:

  • 无人机传感器模组运行与技术难点分析
  • Axure RP 10 预览显示“无标题文档”的空白问题探索【护航版】
  • 美团闪购最新版 mtgsig1.2
  • LP-MSPM0G3507学习--04GPIO控制
  • 消息队列 2.RabbitMQ
  • Elasticsearch:ES|QL 改进的时间线
  • [3-02-01].第01章:框架概述 - Spring生态
  • 表单、表格字段,输入完毕后立即点击【保存】,导致数据未更新就被保存
  • 【教程】基于无人机的大豆光合效率研究
  • 赛思SLIC芯片、语音芯片原厂 赛思SLIC语音芯片ASX630:国产强“芯”赋能FTTR全光网络​
  • vscode 一直连不上远程,网络是通的,ssh 也能直接登录远程
  • 【科研绘图系列】R语言绘制分组箱线图
  • SDC Specical check setting的描述 - false path
  • Docker笔记-部署Redis集群
  • leetcode15.三数之和题解:逻辑清晰带你分析
  • AWS(基础)
  • 网络基础10 :ACL真机实验
  • Redis原理之哨兵机制(Sentinel)
  • 【洛谷P1417】烹调方案 题解
  • ONNX模型使用指南:从零开始掌握跨领域模型部署
  • 图片平铺下去总是有个缝隙的解决方案
  • 塞舌尔公司的查册报告Certificate of Official Search是什么?有什么信息
  • 瀚高数据库开启Oracle兼容模块
  • vue2 面试题及详细答案150道(101 - 120)
  • ubuntu20.04使用unity3d做机器人仿真环境搭建
  • Python单例模式详解:从原理到实战的完整指南
  • 详解Linux(Ubuntu/RedHat/CentOS)及国产服务器统一加域管理方案
  • GoC 上册课程
  • java+vue+SpringBoot集团门户网站(程序+数据库+报告+部署教程+答辩指导)
  • docker--程序自启动