有效的括号--力扣经典面试题

news/2024/11/17 0:41:52/

目录

引言

题目描述:

思路分析:

代码展示:


引言

这道题是关于栈的经典面试题,如果大家对栈这个数据结构不是很了解的话,可以先看这篇博客--数据结构之栈的超详细讲解-CSDN博客

题目描述:

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

有效字符串需满足:

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

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

思路分析:

这是一道很经典的问题,他要求我们对括号进行匹配,这里用其他方法不是很好做,但时用栈这个结构的话,能很轻松的解决.

 这里我们写一个很复杂但是匹配的例子,比如[{()}]

我们用栈来存储所有的左括号,用栈顶元素与右括号进行匹配,这里巧妙使用了栈的后进先出的特性,栈顶元素即为最后一个左括号,与最开始的右括号进行匹配,最后当我们的字符数组没有元素时即为匹配成功.

代码展示:

因为这里需要使用栈这个数据结构,我们这里是使用C语言进行编写,没有C++STL容器可以直接使用,所以需要我们手动实现,大家如果还不会的,可以看数据结构之栈的超详细讲解-CSDN博客这篇博客,这里就不再另外进行讲解

代码如下:


//栈的结构
typedef char STDataType;typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;//函数的声明
//初始化和销毁
void STInit(ST* pst);
void STDestory(ST* pst);
//入栈和出栈
void STPush(ST* pst, STDataType x);
void STPop(ST* pst);
//取栈顶元素
STDataType STTop(ST* pst);
//判空
bool STEmpty(ST* pst);
//获取数据个数
int STSize(ST* pst);//初始化和销毁
void STInit(ST* pst)
{assert(pst);pst->a = NULL;//top指向栈顶数据的下一个位置pst->top = 0;//top指向栈顶数据//pst->top = -1;pst->capacity = 0;
}
void STDestory(ST* pst)
{assert(pst);free(pst->a);pst->a = NULL;pst->top = pst->capacity = 0;
}
//入栈和出栈
void STPush(ST* pst, STDataType x)
{assert(pst);//扩容if (pst->top == pst->capacity){int newcapcacity = pst->capacity == 0 ? 4 : pst->capacity * 2;STDataType* tmp = (STDataType*)realloc(pst->a, newcapcacity * sizeof(STDataType));if (tmp == NULL){perror("realloc fail!");return;}pst->a = tmp;pst->capacity = newcapcacity;}pst->a[pst->top] = x;pst->top++;
}
void STPop(ST* pst)
{assert(pst);assert(pst->top > 0);pst->top--;
}
//取栈顶元素
STDataType STTop(ST* pst)
{assert(pst);assert(pst->top > 0);return pst->a[pst->top - 1];
}
//判空
bool STEmpty(ST* pst)
{assert(pst);return pst->top == 0;
}
//获取数据个数
int STSize(ST* pst)
{assert(pst);return pst->top;
}

 代码:


//栈的结构
typedef char STDataType;typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;//函数的声明
//初始化和销毁
void STInit(ST* pst);
void STDestory(ST* pst);
//入栈和出栈
void STPush(ST* pst, STDataType x);
void STPop(ST* pst);
//取栈顶元素
STDataType STTop(ST* pst);
//判空
bool STEmpty(ST* pst);
//获取数据个数
int STSize(ST* pst);//初始化和销毁
void STInit(ST* pst)
{assert(pst);pst->a = NULL;//top指向栈顶数据的下一个位置pst->top = 0;//top指向栈顶数据//pst->top = -1;pst->capacity = 0;
}
void STDestory(ST* pst)
{assert(pst);free(pst->a);pst->a = NULL;pst->top = pst->capacity = 0;
}
//入栈和出栈
void STPush(ST* pst, STDataType x)
{assert(pst);//扩容if (pst->top == pst->capacity){int newcapcacity = pst->capacity == 0 ? 4 : pst->capacity * 2;STDataType* tmp = (STDataType*)realloc(pst->a, newcapcacity * sizeof(STDataType));if (tmp == NULL){perror("realloc fail!");return;}pst->a = tmp;pst->capacity = newcapcacity;}pst->a[pst->top] = x;pst->top++;
}
void STPop(ST* pst)
{assert(pst);assert(pst->top > 0);pst->top--;
}
//取栈顶元素
STDataType STTop(ST* pst)
{assert(pst);assert(pst->top > 0);return pst->a[pst->top - 1];
}
//判空
bool STEmpty(ST* pst)
{assert(pst);return pst->top == 0;
}
//获取数据个数
int STSize(ST* pst)
{assert(pst);return pst->top;
}bool isValid(char* s) {ST st;STInit(&st);while(*s){//左括号入栈if(*s == '(' || *s == '[' || *s == '{'){STPush(&st, *s);}//右括号取栈顶与左括号尝试匹配else{if(STEmpty(&st)){return false;}char top = STTop(&st);STPop(&st);//不匹配if(top == '(' && *s != ')'|| top == '{' && *s != '}'|| top == '[' && *s != ']'){STDestory(&st);return false;}}++s;}//如果栈不为空,说明左括号必右括号多bool ret = STEmpty(&st);STDestory(&st);return ret;
}

我们重点看后面这个函数,我们先定义栈这个结构,然后进行初始化,当字符数组中有元素时,就进行循环,如果这个字符等于左括号时,将它入栈,否则取栈顶元素与第一个不为左括号的元素进行匹配,如果不匹配直接返回false,注意: 此时返回false时,要销毁我们的栈空间,否则会造成空间浪费.如果匹配成功,字符往下移动,进入下一轮匹配.

注意:

这里最后一定要进行判空处理

力扣中有这样一个例子: S = "{",字符数组中只有一个左括号,我们循环将它入栈后,直接结束,循环过程没有匹配失败,但这并不代表它是匹配的,所以最后进行判空处理,并销毁栈空间.


http://www.ppmy.cn/news/1456053.html

相关文章

【操作指南】银河麒麟高级服务器操作系统内核升级——基于4.19.90-17升级

1. 升级清单 升级包及依赖包清单如下。 kernel ARM架构 kernel-core-4.19.90-23.18.v2101.ky10.aarch64.rpm kernel-modules-4.19.90-23.18.v2101.ky10.aarch64.rpm kernel-4.19.90-23.18.v2101.ky10.aarch64.rpm kernel-modules-extra-4.19.90-23.18.v2101.ky10.aarch64.r…

数据结构相关

数据结构相关 文章目录 数据结构相关[TOC](文章目录)前言一、数据结构介绍二、不同的逻辑结构的存储方案(Java实现)2.1 线性结构&#xff1a;线性表、数组2.2 线性结构&#xff1a;栈2.3 线性结构&#xff1a;队列2.4 树形结构&#xff1a;树 三、一些常见的3.1 布隆过滤器Bloo…

Java实现mysql的分页及流式查询导出

一、前言 在实际应用中&#xff0c;当我们需要导出大数据量数据时&#xff0c;可能会存在一些问题&#xff0c;因为当我们一下子将数据全部加载出来到内存中&#xff0c;很可能会发生OOM(内存溢出)&#xff0c;而且查询会很慢&#xff0c;因为框架耗费大量的时间和内存去把数据…

Linux下网络编程-简易Epll服务器和客户端

Linux下网络编程-简易Epll服务器和客户端 简易Epll服务器: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #include <sys/epoll.h>#define B…

Llama3-Tutorial之XTuner微调Llama3个人小助手

Llama3-Tutorial之XTuner微调Llama3个人小助手 使用XTuner微调llama3模型。 参考&#xff1a; https://github.com/SmartFlowAI/Llama3-Tutorial 1. web demo部署 参考上一节内容已经完成web demo部署&#xff0c;进行对话测试, 当前回答基于llama3官方发布的模型进行推理生成&…

[Linux深度学习笔记4.28]

隐藏权限 : 防止root用户误操作删除, 查看隐藏权限 : lsattr设置隐藏权限 : chattrchattr a : 可以追加内容,不能编辑不能删除chattr i : 不能编辑不能删除文件chattr A :文件访问时间固定下来stat : 查看文件的详细信息 进程管理 : 进程 : 一个正在运行的程序,主进程,子进程线…

MES系统:优化生产执行,实现高效、灵活的制造管理

MES系统作为操作执行层可以缩短排产周期&#xff0c;解决紧急插单问题&#xff1b;通过计划、采集、管控等功能来改进生产执行&#xff1b;与实际生产即时接轨车间时间驱动上层的商务活动。 MES系统包含基础数据、物料和工艺管理、生产过程管理、APS排产、人员管理、设备与工具…

ue引擎游戏开发笔记(33)——武器与角色的匹配,将新武器装备到角色身上

1.需求分析&#xff1a; 武器能出现在世界中&#xff0c;完成了第一步&#xff0c;下一步需要角色和武器适配&#xff0c;即不论角色跑动&#xff0c;射击等&#xff0c;武器和角色都相匹配&#xff0c;将武器装备到角色身上。 2.操作实现&#xff1a; 1.首先先把角色原有的武…