【LeetCode】数据结构题解(10)[有效的括号]

news2024/10/6 2:13:10

有效的括号

  • 😉 1.题目来源
  • 👀2.题目描述
  • 🤔3.解题思路
  • 🥳4.代码展示

在这里插入图片描述

😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘
所属专栏:玩转数据结构题型❤️
🚀 >博主首页:初阳785❤️
🚀 >代码托管:chuyang785❤️
🚀 >感谢大家的支持,您的点赞和关注是对我最大的支持!!!❤️
🚀 >博主也会更加的努力,创作出更优质的博文!!❤️
🚀 >关注我,关注我,关注我,重要的事情说三遍!!!!!!!!❤️
😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘

😉 1.题目来源

LeetCode有效的括号
🚨注意:本题涉及到有关数据结构——栈,这一章节的知识点,如有小伙伴还不熟栈的,可以先复习复习一下有关栈的相关知识,复习的地方我也提供了哦🙂,所用到的知识点——栈
🚨注意:同样的本题是使用纯C语言实现的.

👀2.题目描述

给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
1.左括号必须用相同类型的右括号闭合。
2.左括号必须以正确的顺序闭合。
3.每个右括号都有一个对应的相同类型的左括号。

在这里插入图片描述
🚨🚨🚨🚨🚨🚨🚨🚨🚨

  • 🚨注意:像一下的测试用例也是返回false的哦
    💡: 输入: “( { ) }”;
    💡: 输出:false
    虽然这个有匹配的括号,但是这个是不行的,要满足,匹配一对括号后并拿掉这块括号后,后面的括号还能匹配才行.

  • 💡: 输入: “[ ( { } ) ]”
    💡: 输出:true
    这个便可以.

🤔3.解题思路

  • 🤔当看到这个题目的时候,我们一开始的想法肯定是,通过一个数组把所有的括号存起来,在对数组遍历,通过判断是左括号来给其遍历找到右括号,直到所有括号都匹配完比,如果是这样的话,空间复杂度是O(1),时间复杂度是O(n^2),这样看起来是可以的🤔实则是一个错误的思路,因为我们遍历的时候,虽然所有的括号都匹配成功了,但是😱可能括号的顺序是错误的,就比如:"( { ) }" 或者再如"} { ] [ ) ("这些虽然遍历结束后,得到的都是所有括号都可以匹配成功,但是😮他们顺序是错误的,故返回false
  • 既然匹配成功的同时还要求要顺序不能乱我们就想到了,栈的特殊特点(先进的后出),于是我们就遍历数组,如果遇到的是左括号,我们就入栈,如果遇到的是右括号,我们就出栈匹配,这样根据栈的特性,就很好解决了括号的顺序问题.

💡例一:
在这里插入图片描述
💡例二:
在这里插入图片描述

🚨🚨🚨🚨🚨🚨🚨🚨🚨
🚨注意: 除了上面的情况之外,还可能遇到两种情况

  • 💡1.右括号多了
    如果是左括号多了的话,栈中有又没有括号了,直接返回false

  • 💡2.左括号多了
    如果是右括号多了,就是栈中还有括号,二数组中没有与之匹配的括号了,同样返回false

🥳4.代码展示


//调用栈接口
typedef char STDataType;
typedef struct Stack
{
	STDataType* data;
	int capaciyt;
	int size;
}Stack;

void StackInit(Stack* ps);

void StackDestroy(Stack* ps);

void StackPush(Stack* ps, STDataType x);

void StackPop(Stack* ps);

STDataType StackTop(Stack* ps);

bool StackEmpt(Stack* ps);

int StackSize(Stack* ps);

void StackInit(Stack* ps)
{
	assert(ps);
	ps->data = NULL;
	ps->capaciyt = 0;
	ps->size = 0;
}

void StackDestroy(Stack* ps)
{
	assert(ps);

	free(ps->data);
	ps->data = NULL;
	ps->capaciyt = ps->size = 0;
}

void StackPush(Stack* ps, STDataType x)
{
	assert(ps);

	if (ps->size == ps->capaciyt)
	{
		int newCapacity = ps->capaciyt == 0 ? 4 : ps->capaciyt * 2;
		STDataType* tmp = (STDataType*)realloc(ps->data, sizeof(STDataType) * newCapacity);
		if (tmp == NULL)
		{
			perror("realloc");
			exit(-1);
		}
		ps->data = tmp;
		ps->capaciyt = newCapacity;
	}

	ps->data[ps->size] = x;
	ps->size++;
}

void StackPop(Stack* ps)
{
	assert(ps);
	assert(!StackEmpt(ps));

	ps->size--;
}

STDataType StackTop(Stack* ps)
{
	assert(ps);
	assert(!StackEmpt(ps));

	return ps->data[ps->size - 1];
}

bool StackEmpt(Stack* ps)
{
	assert(ps);

	return ps->size == 0;
}

int StackSize(Stack* ps)
{
	assert(ps);

	return ps->size;
}

//函数实现
bool isValid(char * s)
{
    Stack st;
    //记得初始化
    StackInit(&st);
    while (*s)
    {
        //如果是左括号就入栈
        if (*s == '[' || *s == '(' || *s == '{')
        {
            StackPush(&st,*s);
        }
        //如果是右括号,就出栈对比
        else
        {
        	//如果是左括号更多,栈内数据为空,直接返回false
            if (StackEmpt(&st))
            {
                StackDestroy(&st);
                return false;
            }
            char ch = StackTop(&st);
            StackPop(&st);
            if ((*s == ']' && ch != '[') 
            || (*s == ')' && ch != '(') 
            || (*s == '}' && ch != '{'))
            {
                StackDestroy(&st);
                return false;
            }
        }
         s++;
    }
    //如果是右括号更多,栈中数据不为空,同样返回false
    bool ret = StackEmpt(&st);
    StackDestroy(&st);
    return ret;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/850906.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习笔记:李宏毅ChatGPT Finetune VS Prompt

1 两种大语言模型:GPT VS BERT 2 对于大语言模型的两种不同期待 2.1 “专才” 2.1.1 成为专才的好处 Is ChatGPT A Good Translator? A Preliminary Study 2023 Arxiv 箭头方向指的是从哪个方向往哪个方向翻译 表格里面的数值越大表示翻译的越好 可以发现专门做翻…

vue3 table动态合并,自定义参数合并单元格

<template><div><el-table :data"tableData" :span-method"objectSpanMethod" border:header-cell-style"{ textAlign: center}"><el-table-column prop"area" label"区域" align"center"&g…

如何在页面中嵌入音频和视频?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 嵌入音频⭐ 嵌入视频⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏…

《合成孔径雷达成像算法与实现》Figure3.2

代码参数说明&#xff1a;Sf1为书中公式3.19&#xff0c;Sf2为时域信号快速傅里叶表达式&#xff0c;两种频谱表达式所做出的图可看出其区别 代码如下&#xff1a; clc clear all close all%参数设置 TBP 720; %时间带宽积 T 10e-6; %脉冲持续时间%参数计…

20.5 HTML 媒体

1. video视频标签 video视频标签: 是HTML中用于在网页上嵌入视频的元素.常用的视频标签属性: - src属性: 指定视频文件的URL地址. - controls属性: 用于显示视频播放控件(如播放按钮, 进度条等), 使用户能够控制视频的播放. - width和height: 指定视频的宽度和高度. - autopla…

ESP32 Max30102 (3)修复心率误差

1. 运行效果 2. 新建修复心率误差.py 代码如下: from machine import sleep, SoftI2C, Pin, Timer from utime import ticks_diff, ticks_us from max30102 import MAX30102, MAX30105_PULSE_AMP_MEDIUM from hrcalc import calc_hr_and_spo2BEATS = 0 # 存储心率 FINGER_F…

MATLAB详细安装教程(亲测有效!!)

1.复制以下链接&#xff0c;用百度网盘打开&#xff0c;下载 链接&#xff1a;https://pan.baidu.com/s/19AwQeCRYofGAV8sfDIm5PQ 提取码&#xff1a;mads 我是下载到D盘自己创建的文件中 2.下载完毕后打开此文件夹&#xff0c;点击最后一项 3.点击右上角高级选项&#xff0…

ESP32 Max30102 (2)检测 血氧、温度

1. 运行效果 thonny终端打印的信息如下 注意: 上述的心率值是有很大的误差的,会在下一节课解决这个问题2. 新模块hrcalc.py 在Micorpython端,新建文件hrcalc.py,内容如下 这个文件的作用,可以计算出 【血氧值】 # -*-coding:utf-8# 25 samples

基于身份的安全威胁正在迅速增长

根据端点安全和威胁情报供应商 CrowdStrike 发布的一份报告&#xff0c;目前最危险的网络安全威胁是能够访问给定系统合法身份信息的攻击者。 根据该报告&#xff0c;交互式入侵&#xff08;该公司将其定义为攻击者积极工作以在受害者系统上实现某种非法目的的入侵&#xff09;…

做接口测试如何上次文件

在日常工作中&#xff0c;经常有上传文件功能的测试场景&#xff0c;因此&#xff0c;本文介绍两种主流编写上传文件接口测试脚本的方法。 首先&#xff0c;要知道文件上传的一般原理&#xff1a;客户端根据文件路径读取文件内容&#xff0c;将文件内容转换成二进制文件流的格式…

FOHEART H1数据手套:连接虚拟与现实,塑造智能交互新未来

在全新交互时代背景中&#xff0c;数据手套无疑是一种重要的科技产物。它不仅彻底改变了我们与虚拟世界的互动方式&#xff0c;更为我们提供了一种全新、更为直观的交互形式。 FOHEART H1数据手套结合了虚拟现实、手势识别等高新技术&#xff0c;用先进的传感技术和精准的数据…

DDR4信号仿完整性仿真

在硬件电路设计中&#xff0c;DDR一直是电路设计中的难点。目前正在进行DDR4的电路设计&#xff0c;将基本的仿真设计过程进行一下记录。 主流的仿真工具都是支持DDR4的仿真的&#xff0c;目前使用的主力工具为Sigrity及Hyperlynx&#xff0c;下面以Sigrity系统软件为例说明一…

微服务01-SpringCloud

1、简介 SpringCloud集成了各种微服务功能组件&#xff0c;并基于SpringBoot实现了这些组件的自动装配&#xff0c;从而提供了良好的开箱即用体验。 其中常见的组件包括&#xff1a; 2、服务拆分和远程调用 2.1 服务拆分 这里总结了微服务拆分时的几个原则&#xff1a; …

干货 | 详述 Elasticsearch 向量检索发展史

1. 引言 向量检索已经成为现代搜索和推荐系统的核心组件。 通过将复杂的对象&#xff08;例如文本、图像或声音&#xff09;转换为数值向量&#xff0c;并在多维空间中进行相似性搜索&#xff0c;它能够实现高效的查询匹配和推荐。 图片来自&#xff1a;向量数据库技术鉴赏【上…

企业文件传输软件安全性分析与对比

随着科技的日新月异和应用领域的日益广泛&#xff0c;文件传输软件在人们生活和工作中发挥的作用越来越重大&#xff0c;因此出现了许多不同种类的文件传输软件。但是&#xff0c;随着网络安全问题的严峻&#xff0c;如何确保文件传输软件的安全性成为了一个亟待解决的问题。所…

编写简单的.gitlab-ci.yml打包部署项目

服务器说明&#xff1a; 192.168.192.120&#xff1a;项目服务器 192.168.192.121&#xff1a;GitLab 为了可以使用gitlab的cicd功能&#xff0c;我们需要先安装GitLab Runner 安装GitLab Runner参考&#xff1a; GitLab实现CICD自动化部署_gitlab cidi_程序员xiaoQ的博客-CS…

深入浅出对话系统——闲聊对话系统进阶

引言 本文主要关注生成式闲聊对话系统的进阶技术。 基于Transformer的对话生成模型 本节主要介绍GPT系列文章&#xff0c;这是由OpenAI团队推出的&#xff0c;现在大火的ChatGPT也是它们推出的。 GPT : Improving Language Understanding by Generative Pre-Traini ng 在自…

图的宽度优先深度优先遍历

图常见的遍历方式有两种&#xff0c;一种是宽度优先遍历&#xff0c;一种是深度优先遍历。 宽度优先遍历 宽度优先遍历和之前介绍的二叉树的层级遍历类似&#xff0c;主要也是利用Queue来完成层级的遍历&#xff0c;除此之外&#xff0c;因为图中很可能有环&#xff0c;所以还…

教雅川学缠论07-中枢实战众泰汽车000980

本文实战众泰汽车 下面是2023年11月14-2023年8月8众泰汽车日K图 先画日K 接下来处理包含&#xff0c;就变成下面这个样子 下面在套上缠论的理论&#xff0c;未来股价的走势应该是红色椭圆形虚线里面的样子 好了&#xff0c;文章就到这里&#xff0c;如果众泰最终不是这个走势…

ch6_1 中断及外部设备操作

1. 直接定制表 1.1 移位指令 1.2 操作显存数据 1.3 描述内存单元的标号 1.4 数据的直接定址表 1.5 代码的直接定址表 2.  内中断 2.1 中断及其处理 2.2 编写中断处理程序 2.3 单步中断 2.4 int 指令引发的中断 2.5 BIos , DOS 中断处理 2.5.1 BIOS——基本输…